web-dev-qa-db-ja.com

タイムアウト関数の戻り値

スクリプトを5秒待つために、debianのタイムアウト機能を使用しています。うまく機能しますが、問題は戻り値が必要なことです。タイムアウトの場合は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)がフリーズしている場合、スクリプトは何もしないことです。 。そのため、そのあたりでタイムアウトが必要です。そしてそれがタイムアウトしたとき、サーバーを再起動したいと思います。私はそれを行うことができますが、タイムアウトかどうかを確認する方法はわかりません...

9
Zero

timeoutがタイムアウトになると、 status 124 で終了します。これをチェックして、スクリプトがタイムアウトしたかどうかを判断できます。

18
Stephen Kitt

一致 マニュアルman timeout):

概要タイムアウト[オプション]番号[SUFFIX]コマンド[ARG] ...

[...]コマンドがタイムアウトした場合は、ステータス124で終了します。それ以外の場合は、ステータスがCOMMANDで終了します。

これと、終了ステータスまたは戻り値が変数$?に格納されているという知識を組み合わせると、...

timeout 5 /some/local/script/connect_script -x 'status' > output.txt
RETVAL=$?

次に、$RETVALの値(タイムアウトになった場合は124)、またはconnect_scriptの終了ステータスに基づく他の値に基づいて、より多くの処理を実行できます。

6
Christopher

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です。

0
ceving