SIGSTOP
とSIGKILL
は、プロセスで捕捉および処理できない2つの信号です。キャッチして処理できる点を除いてSIGTSTP
似SIGSTOP
ています。
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
シグナルを除いて、プロセスが続行されるまでプロセスにシグナルを配信できません。シグナルは保留中としてマークされますが、プロセスが続行されるまで配信されません。信号は常にプロセスの終了を引き起こし、遮断取り扱うか、無視することはできません。を無視することもできますが、停止した場合は常にプロセスが続行されます。プロセスにシグナルを送信すると、そのプロセスの保留中の停止シグナルはすべて破棄されます。同様に、プロセスの保留信号は、停止信号を受信すると破棄されますSIGKILL
SIGCONT
SIGCONT
SIGCONT
kill -15
送信済みのメッセージを処理しました」。