我有一个简单的 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 不是很熟悉。
祝你好运!