Я искал способ запустить некоторые пользовательские приложения при входе в мою сессию в LightDM. До сих пор я нашел два разных способа:

1. Настройка .xinitrc: например, если я хочу добавить окно терминала при каждом запуске X-сервера, мне нужно будет только добавить xterm -geometry 80x50+494+51 & перед тем, как exec awesome .

2. Добавьте некоторые приложения в rc.lua: как видно здесь, приложения запускаются при запуске AwesomeWM.

Методы понятны, но я нашел проблему, которая заставила меня задуматься о том, какой вариант будет лучше.

Первый способ будет работать, только если я явно startx в TTY. Запуск X-сервера без этой команды (например, обычное включение компьютера) не запустит приложения. Так, как я мог предотвратить это?

Главный вопрос здесь, однако, заключается в следующем: если я смогу заставить работать .xinitrc , будет ли это «лучшим» (с точки зрения эффективности и безопасности) способом, чем редактирование моей собственной копии rc.lua?

3 ответа3

1

Я считаю, что программы автозапуска 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 перезагружает классно [ничего действительно не меняется, просто сбрасывает память] и, конечно, приложения, которые вы всегда хотите, перезапускаются точно так же, как в первый раз

1

Обновление 2018:

Использование автозапуска XDG по-прежнему является стандартным совместимым способом сделать это. Однако в Awesome v4.3 добавлена новая функция awful.spawn.once, которая заботится о сохранении свойства "единственного экземпляра" приложения непосредственно на X-сервере. Это позволяет вызывать spawn несколько раз, при этом выполняется только один раз. Работает через рестарт.

Оригинал:

Лучше всего реализовать протокол автозапуска XDG. Обычно речь идет о добавлении файлов в ~/.config/autostart затем о запуске приложений с помощью скрипта или демона. Этот скрипт или демон затем запускается менеджером сеанса или из .xinitrc .

rc.lua не должен использоваться для автозапуска, так как он может быть перезапущен в произвольное время (mod4+ctrl+r) и выполнить все заново. У некоторых пользователей есть сложные системы для определения того, было ли что-то уже запущено, но, на мой взгляд, оно того не стоит.

Второй лучший способ - напрямую из .xinitrc .

0

У меня есть очень простой скрипт с именем /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 - круто, но страница, кажется, больше не онлайн ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .