Ubuntu

如果命令達到超時執行其他命令

  • October 17, 2016

我正在嘗試為我學校的電腦設置一個腳本,該腳本會在一天結束時自動關閉它們(因為大多數老師都忘記了它們)。

我想發送一個zenify警告框通知使用者PC將關閉,如果使用者在1分鐘內未確認,PC將關閉。

sudo shutdown -h now我知道 timeout 命令的存在,但在這種情況下,如果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 程序超時時如何執行命令?

您需要檢查退出狀態並據此做出決定。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

引用自:https://unix.stackexchange.com/questions/317007