私はDebian Stretch(systemd)を使用しています。フォアグラウンドでrsyslogデーモンを実行し、
/usr/sbin/rsyslogd -n
+Ctrlを使用してZ停止します。プロセスの状態がTl
(停止、スレッド)に変わります。プロセスに対して複数のコマンドを実行しましたが、プロセスの状態は同じです。一度やってみたら死んだ。 3つの質問があります。kill -15 <pid>
Tl
fg
SIGSTOP
-edプロセスが応答しないのはなぜですかSIGTERM
?カーネルはなぜ同じ状態を維持するのですか?- なぜ信号を受けるとすぐに
SIGCONT
死んだのですか? - 以前のシグナルのために、
SIGTERM
プロセスが再開される前にどこに保存されますか?
答え1
SIGSTOP
SIGKILL
プロセスが捕捉して処理できない2つの信号です。それを除いてSIGTSTP
良いSIGSTOP
できるつかんで処理しました。
SIGSTOP
SIGTSTP
準備中のプロセスを停止するように指示しますSIGCONT
。プロセスに送信すると、SIGTERM
プロセスは実行されていないため、コードを実行して終了できません。
(また、バックグラウンドタスクがSIGTTIN
端末SIGTTOU
に読み書きするときにTTYレイヤで生成される信号です。SIGTSTP
。
何らかの方法で特に処理されないようなプロセスが送信されるCtrlZため、プロセスが中断されるか、プロセスが中断されます。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
。シグナルは保留としてマークされますが、プロセスが続くまで転送されません。このSIGKILL
信号は常にプロセスを終了させ、ブロック、処理、または無視できません。これは無視できますが、SIGCONT
プロセスが停止した場合は常にプロセスが実行され続けます。SIGCONT
プロセスにシグナルを送信すると、そのプロセスの保留中の停止シグナルはすべて削除されます。同様に、SIGCONT
プロセスが停止信号を受信すると、そのプロセスに対して保留中のすべての信号が削除されます。
答え2
SIGTERM
他の人と同じシグナル内部にそれは捕まえることができるプロセスを通して。信号を受信すると、プロセスは特殊な信号ハンドラルーチンにジャンプします。基本SIGTERM
的な作業はプロセスを終了することですが、たとえば、編集者は、終了する前に開かれたファイルのドラフトコピーを保存できるようにシグナルをキャプチャできます。プロセスが停止すると、シグナルハンドラは実行できませんが、プロセスが続くまでシグナルは保留のままです。ご注意ください、数字送信された信号は通常保存されません。
理論的には、システムはプロセスにシグナルハンドラがインストールされているかどうかを知ることができ、SIGTERM
そうでない場合はすぐにシャットダウンします。ただし、(Gillesのコメントに従って)POSIXでは、プロセスが続行するまで信号が保留されることを要求しますSIGCONT
。