我一直在寻找一种在登录 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")
运行得足够好。
我从自动启动-太棒了但该页面似乎不再在线......