SIGTERMを使用してSIGSTOPプロセスを終了できないのはなぜですか。保留中の信号はどこに保存されますか?

SIGTERMを使用してSIGSTOPプロセスを終了できないのはなぜですか。保留中の信号はどこに保存されますか?

私はDebian Stretch(systemd)を使用しています。フォアグラウンドでrsyslogデーモンを実行し、 /usr/sbin/rsyslogd -n +Ctrlを使用してZ停止します。プロセスの状態がTl(停止、スレッド)に変わります。プロセスに対して複数のコマンドを実行しましたが、プロセスの状態は同じです。一度やってみたら死んだ。 3つの質問があります。kill -15 <pid>Tlfg

  • SIGSTOP-edプロセスが応答しないのはなぜですかSIGTERM?カーネルはなぜ同じ状態を維持するのですか?
  • なぜ信号を受けるとすぐにSIGCONT死んだのですか?
  • 以前のシグナルのために、SIGTERMプロセスが再開される前にどこに保存されますか?

答え1

SIGSTOPSIGKILLプロセスが捕捉して処理できない2つの信号です。それを除いてSIGTSTP良いSIGSTOPできるつかんで処理しました。

SIGSTOPSIGTSTP準備中のプロセスを停止するように指示しますSIGCONT。プロセスに送信すると、SIGTERMプロセスは実行されていないため、コードを実行して終了できません。

(また、バックグラウンドタスクがSIGTTIN端末SIGTTOUに読み書きするときにTTYレイヤで生成される信号です。SIGTSTP

何らかの方法で特に処理されないようなプロセスが送信されるCtrlZため、プロセスが中断されるか、プロセスが中断されます。SIGTSTPrsyslogdSIGCONTSIGKILL

ここで解決策は、プロセスが信号を受信して​​処理できるようにSIGCONTユーザーを送信することです。SIGTERM

例:

sleep 999 &

# Assume we got PID 456 for this process
kill -TSTP 456    # Suspend the process (nicely)
kill -TERM 456    # Terminate the process (nicely). Nothing happens
kill -CONT 456    # Continue the process so it can exit cleanly

出荷書類ビーチGNU Cライブラリ私は(私の強調が)これをかなりよく説明すると思います。

プロセスが停止すると、プロセスが継続して実行されるまで信号を転送できなくなります。SIGKILL、信号、および(明らかに)信号を除いてSIGCONT。シグナルは保留としてマークされますが、プロセスが続くまで転送されません。このSIGKILL信号は常にプロセスを終了させ、ブロック、処理、または無視できません。これは無視できますが、SIGCONTプロセスが停止した場合は常にプロセスが実行され続けます。SIGCONTプロセスにシグナルを送信すると、そのプロセスの保留中の停止シグナルはすべて削除されます。同様に、SIGCONTプロセスが停止信号を受信すると、そのプロセスに対して保留中のすべての信号が削除されます。

答え2

SIGTERM他の人と同じシグナル内部にそれは捕まえることができるプロセスを通して。信号を受信すると、プロセスは特殊な信号ハンドラルーチンにジャンプします。基本SIGTERM的な作業はプロセスを終了することですが、たとえば、編集者は、終了する前に開かれたファイルのドラフトコピーを保存できるようにシグナルをキャプチャできます。プロセスが停止すると、シグナルハンドラは実行できませんが、プロセスが続くまでシグナルは保留のままです。ご注意ください、数字送信された信号は通常保存されません。

理論的には、システムはプロセスにシグナルハンドラがインストールされているかどうかを知ることができ、SIGTERMそうでない場合はすぐにシャットダウンします。ただし、(Gillesのコメントに従って)POSIXでは、プロセスが続行するまで信号が保留されることを要求しますSIGCONT

関連情報