我正在尝试为学校的计算机设置一个脚本,在一天结束时自动关闭它们(因为大多数老师忘记了它们)。
我想发送一个 zenify 警告框来通知用户 PC 将关闭,如果用户在 1 分钟内没有确认,PC 将关闭。
我知道超时命令的存在,但在这种情况下,sudo shutdown -h now
如果该zenity
命令在 60 秒内没有返回,我想调用。
我试图做类似的事情
timeout 60 --onTimeout="sudo shutdown -h now" zenity --warning --text="This PC is going to shut down in a minute if you DO NOT press the OK button."
该命令将在 cron 脚本中执行。
所以,问题是:当 zenity 程序超时时如何执行命令?
答案1
您需要检查退出状态并据此做出决定。这GNU 超时手册说
如果命令超时,并且未设置 --preserve-status,则退出并显示状态 124。
因此,在 shell 脚本中,您可以执行以下操作:
timeout 60 zenity ...
if [ $? = 124 ] ; then
echo it timed out, do something...
else
echo didn't time out
fi
不过,看来zenity 本身支持超时,所以你不需要外部超时:
zenity --timeout 60 --warning --text="Shutdown in 60"
if [ $? = 5 ] ; then
sudo shutdown -h now
fi
即使使用Zenity自己的超时,它似乎也没有显示剩余时间。然而,它确实有一个进度条模式,可以用来传达一种厄运即将来临的感觉。像这样的东西会显示一个从 60 开始倒计时的计时器,同时进度条会填满:
#!/bin/bash
timeout=60
for (( i=0 ; i <= $timeout ; i++ )) do
echo "# Shutdown in $[ $timeout - $i ]..."
echo $[ 100 * $i / $timeout ]
sleep 1
done | zenity --progress --title="Shutting down automatically..." \
--window-icon=warning --width=400 --auto-close
if [ $? = 0 ] ; then
echo timeout passed
else
echo cancel was pressed or zenity failed somehow
fi