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

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

コメント

  • できます'
  • シリアル回線の読み取りと書き込みを行っており、UDPおよびTCP要求に応答しています。実行をbashスクリプトでラップしたので、終了コードを知っています。
  • Posixのドキュメントによると、SIGTERMは厳密にユーザーレベルのイベントです。他の誰かがあなたのサーバープログラムを殺すことができた可能性はありますか?
  • あなたはそうです!戻りコード0は、通常の終了を意味します。 SIGTERMがあった場合、$?は143(128 +シグナル番号)に設定されます。
  • また、^ CはSIGINTERであり、SIGTERMではありません。 130のコードで終了します。

回答

これを回答として投稿しますので、これが問題であることが判明した場合は、何らかの解決策があります。

終了ステータス0は、プログラムが正常に終了したことを意味します。 終了プログラムは、終了ステータスとして0から255までの任意の整数を選択できます。従来、プログラムは小さな値を使用していました。値126以上は、特別な条件を報告するためにシェルによって使用されるため、それらを回避するのが最善です。

C APIレベルでは、プログラム reportプログラムの終了ステータスと、プログラムを強制終了したシグナル(存在する場合)の両方をエンコードする16ビットステータス¹

シェルでは、コマンドの終了ステータス$?に保存)は、プログラムの実際の終了ステータスとシグナル値を圧縮します。プログラムがシグナルによって強制終了された場合、$?は128より大きい値に設定されます(ほとんどのシェルでは、この値は128 +シグナル番号です。ATTkshは256 +シグナル番号を使用し、yashは384+シグナル番号を使用します。あいまいさはありますが、他のシェルはそれに追随していません。

特に、$?が0の場合、プログラムは正常に終了しました。

これには、SIGTERMを受信するが、そのためのシグナルハンドラーがあり、最終的には正常に終了するプロセスの場合が含まれることに注意してください(おそらくSIGTERMシグナルの間接的な結果であり、おそらくそうではありません。


タイトルの質問に答えるために、SIGTERMがシステムによって自動的に送信されることはありません。端末が停止したときのSIGHUP、プロセスが実行すべきでないことを実行したときのSIGSEGV / SIGBUS / SIGILL、壊れたパイプ/ソケットに書き込むときのSIGPIPEなど、自動的に送信されるシグナルがいくつかあります。端末でキーを押したために送信されるいくつかのシグナル。主に Ctrl + C のSIGINT、 Ctrl + のSIGQUITです。 \ および Ctrl + Z のSIGTSTPですが、SIGTERMはそれらの1つではありません。プロセスがSIGTERMを受信すると、他のプロセスがそのシグナルを送信しました。

¹大まかに言えば

コメント

  • シグナルを受信したときに終了ステータスがどのように決定されるかについてのわかりやすい説明。ただし、この回答はOP 'の質問に'対応していません。
  • @codeforesterタイトルの質問ではなく、本文です。本文の質問の1つです。誤解に基づいているため、少し面倒です。I'残りについていくつかの単語を追加します。
  • それはシェルによって異なります。 ksh93では、' s 256 + signum、yashでは' s 384 + signum
  • 注意してください。 256 a la kshを超える値を使用すると、exitに渡されなくなるため、必ずしも良いとは限りません。 yashアプローチは適切な妥協案ですが、別のアプローチについてはrcを参照してください。 プロセス終了時のデフォルトの終了コード?

回答

SIGTERMは、プロセスを管理上終了するために通常使用されるシグナルです。

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

これは、killpkillkillall …コマンド。

これは、デーモンを停止するためにデーモンに送信されるシグナル(service some-service stopなど)、またはinitシャットダウン前(SIGTERMで時間内に終了できなかったプロセスの場合はSIGKILLが続きます)。

SIGTERMは 送信されるシグナルではないことに注意してください。 div id = “32cc05daec”>

^Cで送信されるシグナルはSIGINTです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です