コマンドがタイムアウトした場合は、別のコマンドを実行してください。

コマンドがタイムアウトした場合は、別のコマンドを実行してください。

私は学校のコンピュータが一日の終わりに自動的に終了するようにスクリプトを設定しようとしています(ほとんどの教師はこれを忘れてしまうからです)。

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

関連情報