私は学校のコンピュータが一日の終わりに自動的に終了するようにスクリプトを設定しようとしています(ほとんどの教師はこれを忘れてしまうからです)。
PCが終了することをユーザーに知らせるためにzenify警告ボックスを送信し、ユーザーが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で終了します。
したがって、シェルスクリプトでは次のことができます。
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