スクリプトを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)がフリーズしている場合、スクリプトは何もしないことです。 。そのため、そのあたりでタイムアウトが必要です。そしてそれがタイムアウトしたとき、サーバーを再起動したいと思います。私はそれを行うことができますが、タイムアウトかどうかを確認する方法はわかりません...
timeout
がタイムアウトになると、 status 124 で終了します。これをチェックして、スクリプトがタイムアウトしたかどうかを判断できます。
一致 マニュアル (man timeout
):
概要タイムアウト[オプション]番号[SUFFIX]コマンド[ARG] ...
[...]コマンドがタイムアウトした場合は、ステータス124で終了します。それ以外の場合は、ステータスがCOMMANDで終了します。
これと、終了ステータスまたは戻り値が変数$?
に格納されているという知識を組み合わせると、...
timeout 5 /some/local/script/connect_script -x 'status' > output.txt
RETVAL=$?
次に、$RETVAL
の値(タイムアウトになった場合は124)、またはconnect_script
の終了ステータスに基づく他の値に基づいて、より多くの処理を実行できます。
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です。