Программы.xinitrc и AwesomeWM Autorun. Какой из них лучше?
Я искал способ запустить некоторые пользовательские приложения при входе в мою сессию в LightDM. До сих пор я нашел два разных способа:
1. Настройте.xinitrc: например, если я хочу добавить окно терминала при каждом запуске X-сервера, мне нужно будет только добавить xterm -geometry 80x50+494+51 &
до exec awesome
,
2. Добавьте некоторые приложения в rc.lua: как видно здесь, приложения запускаются при запуске AwesomeWM.
Методы понятны, но я нашел проблему, которая заставила меня задуматься о том, какой вариант будет лучше.
Первый способ будет работать, только если я явно наберу startx
в TTY. Запуск X-сервера без этой команды (например, обычное включение компьютера) не запустит приложения. Так, как я мог предотвратить это?
Но главный вопрос здесь: если я смогу .xinitrc
работать, будет ли это "лучше" (с точки зрения эффективности и безопасности), чем редактировать мою собственную копию rc.lua
?
3 ответа
Обновление 2018:
Использование автозапуска XDG по-прежнему является стандартным совместимым способом сделать это. Однако в Awesome v4.3 добавлена новая функция awful.spawn.once, которая заботится о сохранении свойства "единственного экземпляра" приложения непосредственно на X-сервере. Это позволяет spawn
быть вызванным несколько раз при выполнении только один раз. Работает через рестарт.
Оригинал:
Лучше всего реализовать протокол автозапуска XDG. Обычно речь идет о добавлении файлов в ~/.config/autostart
затем с помощью скрипта или демона позаботьтесь о запуске приложений. Этот скрипт или демон запускается либо менеджером сеанса, либо из .xinitrc
,
rc.lua
не следует использовать для автозапуска, так как он может быть перезапущен в произвольное время (mod4+ctrl+r
) и заново все выполнить. У некоторых пользователей есть сложные системы для определения, если что-то уже запущено, но, на мой взгляд, оно того не стоит.
Второй лучший способ напрямую из .xinitrc
,
Я считаю, что программы автозапуска AwesomeWM лучше, когда они сделаны хорошо
Почему = Если вы выходите из одной из программ "автозапуск * всегда" и хотите перезапустить их, вы (a) перезапустите X [закрытие всего процесса], (b) перезапустите их из оболочки [выходные сообщения теперь отправляются в эту оболочку], (c) создайте специальный код перезапуска в rc.lua [поверх кода запуска, который вы положили в.xinitrc
Как = Это хорошо работает для меня... а) Как только после строки отладки в rc.lua добавить...
local gears = { table = require( "gears.table" ) ,
p_call = require( "gears.protected_call" ) }
gears.p_call( dofile, path_this .. "runonce.lua" )
б) А вот часть "когда сделано хорошо" (ИМХО), которая находится в runonce.lua...
local naughty = require( "naughty" )
local awful = { spawn = require( "awful.spawn" ) }
local string = { sub = string.sub ,
find = string.find ,
format = string.format }
-- This function makes sure the application is not restarted when awesome is reloaded
local function run_once( command )
local args_start = string.find( command, " " )
local pgrep_name = args_start and command:sub( 0, args_start - 1 ) or command
local command = "pgrep -u $USER -x " .. pgrep_name .. " > /dev/null || (" .. command .. ")"
awful.spawn.easy_async_with_shell(
command,
function( stdout, stderr, exitreason, exitcode )
if exitcode ~= 0 then
naughty.notify({
preset = naughty.config.presets.critical ,
text = string.format( "%s\n\n%s\n%s\n%s\n%s",
command,
stdout,
stderr,
exitreason,
exitcode ) })
end
end )
end
-- Start these if not already running
run_once( "guake &> /dev/null" )
run_once( "remmina -i &> /dev/null" )
run_once( "skypeforlinux" )
Почему я считаю, что это сделано хорошо...
1) Работает с программами, которые имеют параметры [ищет только имя, а не аргументы] 2) Имеет предупреждение, если что-то идет не так [без убийства Awesome] 3) Редактируйте только нижний раздел
Наконец... mod+ctrl+r перезагружает классно [ничего не меняется, просто сбрасывает память] и, конечно, приложения, которые вы всегда хотите, перезапускаются точно так же, как в первый раз
У меня есть очень простой скрипт с именем /usr/local/bin/awesome_run_once
:
#!/bin/bash
pgrep $@ > /dev/null || ($@ &)
В конце моего ~/.config/awesome/rc.lua
Я добавляю несколько звонков к нему с приложением, которое хочу запустить:
-- auto start programs
awful.util.spawn("awesome_run_once wicd-client")
awful.util.spawn("awesome_run_once redshift")
awful.util.spawn("awesome_run_once nextcloud")
Работает достаточно хорошо.
Я получил эту идею от Autostart - круто, но страница, кажется, больше не онлайн...