システムはいつSIGTERMをプロセスに送信しますか?

システムはいつSIGTERMをプロセスに送信しますか?

私のサーバープログラムはSIGTERMを受信して​​停止します(終了コード0)。私はそれが十分なメモリを持っていると確信しているので、これに驚きました。 Linux(busybox)はどのような条件でSIGTERMをプロセスに送信しますか?

答え1

問題が発生した場合の解決策を見つけるために、この内容を回答として投稿します。

終了ステータス 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の場合はSIGQUIT、+の場合はSIGTSTPですが、SIGTERMはそのうちの1つではありません。あるプロセスがSIGTERMを受信すると、他のプロセスがシグナルを送信します。Ctrl\CtrlZ

1おおよそ言えば

答え2

SIGTERM は、プロセスの終了を管理するために一般的に使用される信号です。

これはカーネルが送信する信号ではありませんが、通常、プロセスが他のプロセスを(正常に)終了するために送信する信号です。

killこれは基本的に、、、pkill...コマンドkillallによって送信される信号です。

service some-service stopこれは、デーモンプロセスを停止するために送信されるシグナルです(例:SIGTERMで)、または終了前init(SIGTERMで時間内に終了しなかったプロセスに対してSIGKILLが続きます)。

SIGTERMはいいえ信号が送信されました^C。送信される信号^CはSIGINTです。

答え3

他の回答に加えて、SIGTERMは通常、HPCクラスタのジョブスケジューラで実行されているプロセスに送信されます。スケジューラは通常、SIGKILL を使用してプロセスを終了する前に SIGTERM を送信します。

  • タイムアウトを超えて実行されるジョブの場合、SIGTERM は SIGKILL の前に送信されます。
  • LSFSIGKILL で実行されるジョブの場合、SIGINT が最初に送信され、次に SIGTERM が送信されます。時間またはメモリ限界。

設定された時間制限によっては、SIGTERMとSIGKILLの間でプロセスが完了する可能性が多少ある場合があります。デフォルトは数十秒の範囲です。

関連情報