SIGTERMでSIGSTOPされたプロセスを強制終了できないのはなぜですか?保留中のシグナルはどこに保存されますか?


24

Debian stretch(systemd)を使用しています。フォアグラウンドでrsyslogデーモンを実行して/usr/sbin/rsyslogd -n いたので、Ctrl+ Zを押し て停止しました。プロセスの状態がTl(停止、スレッド化)に変更されました。プロセスに複数のコマンドを発行しましたが、プロセスの状態は同じでした。をしたら、それは死にました。質問が3つあります。kill -15 <pid>Tlfg

  • SIGSTOP-edプロセスが応答しなかったのはなぜSIGTERMですか?カーネルがカーネルを同じ状態に保つのはなぜですか?
  • SIGCONT信号を受信した瞬間になぜ殺されたのですか?
  • 前のSIGTERMシグナルが原因であった場合、プロセスが再開するまでどこに保存されていましたか?

回答:


41

SIGSTOPSIGKILLは、プロセスで捕捉および処理できない2つの信号です。キャッチして処理できる点を除いてSIGTSTPSIGSTOPています。

SIGSTOPそしてSIGTSTP信号がの準備ができて、そのトラックにプロセスを停止しますSIGCONT。そのプロセスを送信するSIGTERMと、プロセスは実行されていないため、終了するコードを実行できません。

SIGTTINおよびがありますSIGTTOU。これは、バックグラウンドジョブが端末に読み書きしようとするときにTTYレイヤーによって生成される信号SIGTSTPです。この回答の残りの部分ではこれら2つを無視します。)

あなたは、CtrlZプロセスAに送信SIGTSTPすることによってどのような方法で、特別に処理されていないよう、rsyslogdそれは単に保留中のプロセスを中断して、SIGCONTまたはSIGKILL

ここでの解決策は、プロセスがシグナルを受信して​​処理できるように、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シグナルを除いて、プロセスが続行されるまでプロセスにシグナルを配信できません。シグナルは保留中としてマークされますが、プロセスが続行されるまで配信されません。信号は常にプロセスの終了を引き起こし、遮断取り扱うか、無視することはできません。を無視することもできますが、停止した場合は常にプロセスが続行されます。プロセスにシグナルを送信すると、そのプロセスの保留中の停止シグナルはすべて破棄されます。同様に、プロセスの保留信号は、停止信号を受信すると破棄されますSIGKILLSIGCONTSIGCONTSIGCONT


1
@nohup。回答は拡張されましたが、基本的には「はい。kill -15送信済みのメッセージを処理しました」。
ロアイマ

2
ドキュメントによると、@ nohupはい»
ロアイマ

1
また、プロセスを停止することもSIGTTINおよびSIGTTOUを参照してください
ステファンChazelas

1
@StéphaneChazelas良い点。これらの言及を追加しましたが、それ以外は無視しました。適切に編集してください。
ロアイマ

2
@coteyr。私は同意しSIGKILLません:アプリがクリーンアップするのを防ぐのでSIGTERM、多くの(ほとんどの)場合に使用することが望ましいです。
ロアイマ

9

SIGTERMプロセスでキャッチできるというで、他のシグナルとまったく同じです。シグナルを受信すると、プロセスは特別なシグナルハンドラルーチンにジャンプします。以下の場合、デフォルトのアクションは、プロセスを終了させることはなく、例えばますエディタは、それが死ぬ前に、開いているファイルのドラフトコピーを保存することができるように信号をキャッチしたいかもしれません。プロセスが停止している場合、シグナルハンドラを実行できませんが、プロセスが継続するまでシグナルは保留状態のままになります。通常、送信される信号のは保存されないことに注意してください。SIGTERM

理論的には、システムは、プロセスににシグナルハンドラがインストールされているかどうかを知りSIGTERM、ない場合はすぐに終了できます。しかし(Gillesのコメントによると)POSIXは、プロセスがを介して続行されるまでシグナルが保留されることを要求しSIGCONTます。


4
謝罪、私の以前のコメントは間違っていました。プロセスが停止している間、SIGKILLとSIGCONTを除いて、シグナルは配信されません。シグナルにプロセスを強制終了するというデフォルトのアクションがある場合でも、SIGCONTによってプロセスが再開されるまでこれは遅延します。POSIXはこの動作を義務付けています。
ジル「SO-悪であるのをやめる」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.