これが問題であることが判明した場合に何らかの解決策があるように、これを回答として投稿します.
0 の終了ステータスは、成功したプログラムからの通常の終了を意味します。終了するプログラムは、終了ステータスとして 0 から 255 までの任意の整数を選択できます。通常、プログラムは小さい値を使用します。 126 以上の値は、シェルが特別な状態を報告するために使用するため、避けるのが最善です。
C API レベルでは、プログラムは 16 ビット ステータス¹ を報告します。これは、プログラムの終了ステータスと、プログラムを強制終了したシグナル (存在する場合) の両方をエンコードします。
シェルでは、コマンドの終了ステータス ($?
に保存されます) ) は、プログラムの実際の終了ステータスとシグナル値を混同します:プログラムがシグナルによって強制終了された場合、$?
は 128 より大きい値に設定されます (ほとんどのシェルでは、この値は 128 にシグナル番号を加えたものです。ATT ksh は 256 + シグナル番号を使用し、yash は 384 + シグナル番号を使用してあいまいさを回避しますが、他のシェルはこれに従っていません。スーツ)
特に、$?
の場合 が 0 の場合、プログラムは正常に終了しました。
これには、SIGTERM を受け取るプロセスの場合も含まれますが、そのプロセスのシグナル ハンドラーがあり、最終的には正常に終了します (おそらく SIGTERM シグナルの間接的な結果として、おそらくそうではありません)。
タイトルの質問に答えるために、SIGTERM がシステムによって自動的に送信されることはありません。端末がなくなったときの SIGHUP、プロセスが実行すべきでないことを実行したときの SIGSEGV/SIGBUS/SIGILL、壊れたパイプ/ソケットに書き込むときの SIGPIPE など、自動的に送信されるシグナルがいくつかあります。端末でキーを押したために送信されるいくつかのシグナル。主に Ctrl の SIGINT +C 、 Ctrl の SIGQUIT +\ Ctrl の SIGTSTP +Z 、しかし SIGTERM はそれらの 1 つではありません。プロセスが SIGTERM を受信した場合、他のプロセスがそのシグナルを送信しました。
¹ 大まかに言えば
SIGTERM は、通常、プロセスを管理上終了するために使用されるシグナルです。
これはカーネルが送信するシグナルではありませんが、プロセスが別のプロセスを (正常に) 終了するために通常送信するシグナルです。
これは、kill
によってデフォルトで送信されるシグナルです。 、 pkill
、 killall
... コマンド。
これは、デーモンを停止するためにデーモンに送信されるシグナルです (service some-service stop
など)。 )、または init
で送信 シャットダウン前 (SIGTERM で時間内に終了できなかったプロセスの SIGKILL が続きます)。
SIGTERM はではないことに注意してください ^C
で送信されるシグナル . ^C
で送信されたシグナル