私はDebianのタイムアウト機能を使ってスクリプトを5秒間待ちます。これはうまくいきますが、私が経験している問題は戻り値が必要であるということです。たとえば、1 はタイムアウトを意味し、0 はタイムアウトがないことを意味します。どうすればいいですか?
私のコードを見てください。
timeout 5 /some/local/script/connect_script -x 'status' > output.txt
# here i need the return of timeout
ご覧のとおり、私のconnect_script -x 'status'はステータスを文字列として返し、それを画面に印刷します(おそらくこれを見ることはできません)。この質問の文脈は、サーバ(connect_scriptの場合)が停止する場合、スクリプトは何もしません。そのため、タイムアウトが必要です。タイムアウトしたらサーバーを再起動したいと思います。できますが、タイムアウトするかどうかを確認する方法がわかりません...
答え1
タイムアウトが発生するとtimeout
終了ステータス124; これを確認して、スクリプトがタイムアウトしたことを確認できます。
答え2
~によると手動( man timeout
):
要約タイムアウト[オプション]番号[サフィックス]コマンド[ARG]...
[...] コマンドがタイムアウトすると、ステータス124で終了します。それ以外の場合は COMMAND 状態で終了します。
これを終了状態または戻り値が変数に格納されるという知識と組み合わせると、次のような利点が$?
得られます。
timeout 5 /some/local/script/connect_script -x 'status' > output.txt
RETVAL=$?
これにより、値$RETVAL
(タイムアウト時に124になる)に基づいてより多くの処理を実行したり、終了状態に応じて異なる値を実行したりできますconnect_script
。
答え3
戻り値は、timeout
子プロセスの終了に使用した信号によって異なります。
SIGTERM
124を返します。
timeout -s SIGTERM 1 sleep 2; echo $?
しかし、SIGKILL
137を返します。
timeout -s SIGKILL 1 sleep 2; echo $?
マニュアルページを参照してください。
コマンドがタイムアウトし、--preserve-statusが設定されていない場合、ステータス124で終了します。それ以外の場合は COMMAND 状態で終了します。信号が指定されていない場合は、タイムアウト時にTERM信号が送信されます。 TERM信号は、信号を遮断または捕捉しないすべてのプロセスを終了します。キャッチできないため、KILL(9)信号を使用する必要があります。この場合、終了ステータスは124ではなく128 + 9です。