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プロセスが停止信号を受信すると、そのプロセスに対して保留中のすべての信号が削除されます。

おすすめ記事