無限ループ終了

無限ループ終了

終了するたびに自動的に再実行したいコマンドがあり、次のようなコマンドを実行しました。

while [ 1 ]; do COMMAND; done;

ただし、asを使用してループを停止できない場合、ループ全体はCtrl-c終了しません。COMMAND

同様のことを達成していますが、端末を閉じずに停止するにはどうすればよいですか?

答え1

ctrl+を使用して実行中のジョブを停止してバックグラウンドに配置できますz。その後、次の操作でジョブを終了できます。

$ kill %1

ここで[1]はあなたの仕事番号です。

答え2

コマンドの終了状態を確認してください。コマンドが信号によって終了した場合、終了コードは128 +信号番号です。 ~からBash用GNUオンラインドキュメント:

シェルの場合、終了ステータス0で終了したコマンドは成功しました。ゼロ以外の終了状態は失敗を示します。したがって、一見不可逆的なこのスキームを使用すると、成功を示す明確に定義された方法と、さまざまな失敗モードを表すさまざまな方法があります。致命的な信号番号Nが原因でコマンドが終了すると、Bashは128 + Nの値を終了状態として使用します。

POSIX はまた、以下を指定します。シグナルによって終了するコマンドは128より大きい値を持ちますが、正確な値はGNUのように指定されていないようです。

信号の受信によって終了するコマンドは、128を超える終了状態を報告する必要があります。

たとえば、Control-Cを使用してコマンドを中断すると、SIGINTはUnixシステムではシグナル2であるため、終了コードは130になります。だから:

while [ 1 ]; do COMMAND; test $? -gt 128 && break; done

答え3

無限ループをスクリプトに入れ、そこから信号を処理する方が良いと言いたいです。これは基本出発点。私はあなたがそれを適切に修正したいと確信しています。このスクリプトは - (または ) をtrapキャッチしてコマンドを終了し(ここではテストとして使用しています)、終了します。ctrlcSIGTERMsleep

cleanup ()
{
kill -s SIGTERM $!
exit 0
}

trap cleanup SIGINT SIGTERM

while [ 1 ]
do
    sleep 60 &
    wait $!
done

答え4

bash を実行すると、-eエラー状態が発生すると終了します。

#!/bin/bash -e
false # returns 1
echo This won't be printed

関連情報