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


9

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

回答:


19

場合はtimeoutタイムアウトには、それはで終了ステータス124。これをチェックして、スクリプトがタイムアウトしたかどうかを判断できます。


そう、ありがとう。マニュアルでこれを見逃しています。@クリストファーは私のために働く答えを投稿します。$分からないの?構文。あなたの答えの両方が正しいですので;)
ゼロ

6

マニュアルによるman timeout):

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

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

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

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

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


1

の戻り値はtimeout、子を終了するために使用する信号によって異なります。

SIGTERM 124を返します。

timeout -s SIGTERM 1 sleep 2; echo $?

しかし、SIGKILL137を返します。

timeout -s SIGKILL 1 sleep 2; echo $?

マニュアルページを参照してください:

コマンドがタイムアウトし、-preserve-statusが設定されていない場合は、ステータス124で終了します。それ以外の場合は、ステータスがCOMMANDで終了します。シグナルが指定されていない場合は、タイムアウト時にTERMシグナルを送信します。TERMシグナルは、そのシグナルをブロックまたはキャッチしないプロセスを強制終了します。このシグナルをキャッチできないため、KILL(9)シグナルを使用する必要がある場合があります。この場合、終了ステータスは124ではなく128 + 9です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.