.xinitrc 与 AwesomeWM 自动运行程序。哪一个更好?

.xinitrc 与 AwesomeWM 自动运行程序。哪一个更好?

我一直在寻找一种在登录 LightDM 会话时启动一些自定义应用程序的方法。到目前为止,我发现了两种不同的方法:

1. 自定义.xinitrc:例如,如果我想在启动 X 服务器时添加一个终端窗口,我只需要xterm -geometry 80x50+494+51 &在之前添加exec awesome

2.向rc.lua添加一些应用程序:正如所见这里,这些应用程序将在 AwesomeWM 启动时启动。

方法很清楚,但是我发现一个问题,让我思考什么选择更好。

第一种方法只有在我明确输入 TTY 时才有效startx。不使用这个命令启动 X 服务器(例如,正常打开计算机)将不会启动应用程序。那么我该如何防止这种情况发生呢?

不过,这里的主要问题是:如果我可以完成.xinitrc工作,那么这是否是一种比编辑我自己的副本“更好”的方法(就效率和特别是安全性而言)rc.lua

答案1

我相信如果做得好,AwesomeWM 自动运行程序会更好

为什么 = 如果你退出某个“总是自动运行”的程序并想重新启动它们,你可以(a)重新启动 X [关闭进程中的所有内容],(b)从 shell 重新启动它们 [输出消息现在转到该 shell],(c)在 rc.lua 中创建特殊的重新启动代码 [在你放入 .xinitrc 的启动代码之上

如何 = 这对我来说很有效... a) 在 rc.lua 中的调试行之后立即添加...

    local gears         = { table   = require( "gears.table" )          ,
                            p_call  = require( "gears.protected_call" ) }

    gears.p_call( dofile, path_this .. "runonce.lua" )

b) 这是 runonce.lua 中的“做得好时”部分(IMHO)...

    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 重新加载很棒 [实际上没有任何变化,只是重置内存] 当然,您一直想要的应用程序会以与第一次完全相同的方式重新启动

答案2

2018年更新:

使用 XDG 自动启动仍然是实现此目的的标准方式。但是 Awesome v4.3 添加了新的可怕的.spawn.once函数负责将应用程序的“单实例”属性直接保存在 X 服务器中。这样可以spawn多次调用,但只执行一次。它在重启后仍能正常工作。

原来的:

最好的方法是实现 XDG 自动启动协议。它通常是将文件添加到,~/.config/autostart然后让脚本或守护进程负责启动应用程序。然后,此脚本或守护进程由会话管理器启动,或者从 启动.xinitrc

rc.lua不应将其用于自动启动,因为它可以在随机时间重新启动 ( mod4+ctrl+r) 并重新执行所有内容。有些用户有复杂的系统来检测某些东西是否已经启动,但在我看来,这并不值得。

第二最佳方式是直接从.xinitrc

答案3

我有一个非常简单的脚本,名为/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")

运行得足够好。

我从自动启动-太棒了但该页面似乎不再在线......

相关内容