如果命令超时则执行其他命令

如果命令超时则执行其他命令

我正在尝试为学校的计算机设置一个脚本,在一天结束时自动关闭它们(因为大多数老师忘记了它们)。

我想发送一个 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

相关内容