为什么我的脚本在启动时不起作用?

为什么我的脚本在启动时不起作用?

我有一个简单的 bash 脚本:

while [[ true ]]
do
    status="$(xset q | grep 'Monitor is Off')"
    if [[ $status != '' ]] ; then
        #shutdown the computer
        dbus-send --system --print-reply --dest=org.freedesktop.login1.Manager.Poweroff" boolean:true
    fi
done

所以每当我的屏幕关闭时,我的电脑就会关机。当我从终端启动它时,这个脚本工作得很好,但我想每次启动时都执行它。我在 rc5.d 中放置了一个符号链接,似乎可以工作。pgrep poweroff显示脚本 PID,但是,猜猜!如果屏幕关闭,电脑就不会关机。我不明白为什么。

答案1

分析

您的脚本是在启动时启动的,因此不遵循登录过程,因此它没有环境变量或可能只有非常有限的设置。我相信没有 DISPLAY,甚至可能没有 PATH。因此设定命令失败,地位保持空白,dbus 发送从未达到。
您可以通过将脚本中的 xset 命令更改为以下内容来验证我的解释:

status="$(xset q 2>/tmp/output.err | grep'监视器已关闭')"

然后重新启动并检查文件 /tmp/output.err

解决方案

我没有确切的解决方案。你必须做一些工作,并进行各种重新启动和错误检查。
哦……我敦促你更改脚本的名称。你给它命名关机我也是,忘记了这是系统命令。猜猜我运行脚本时发生了什么...

好的,第一个动作。
在脚本顶部添加:

导出 DISPLAY=:0.0
env > /tmp/output.log

while 循环添加

睡 5

命令来防止出现巨大的 /tmp/output.err 文件。

重新启动系统并检查 /tmp 中的输出文件。如果 output.err 为空,则设定命令没有失败。如果失败了,您需要在脚本中定义更多环境变量。可能是一个或多个 XDG_ 变量,抱歉,我对 X11 不是很熟悉。
祝你好运!

相关内容