システムはいつ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おおよそ言えば

おすすめ記事