「殺す」のか`正しい削除順序を見つけますか(または正しい再試行が行われましたか?)

「殺す」のか`正しい削除順序を見つけますか(または正しい再試行が行われましたか?)

kill <PID list>一部のプロセスは他のプロセスより前に終了できないため、そのようなプロセスを終了しようとし、放棄し、その「パートナー」を正常に終了して前のプロセスも終了する可能性があるにもかかわらず、終了していないまま残す状況を考えることができます。後でもう一度やり直してください。

これが真であれば、もう一つの質問は、kill <PID list>リスト内のPIDの順序が尊重されるかどうかです。または、プロセスが終了する順序を制御するために別々の終了プロセスを使用する必要がありますか?

答え1

各宛先に順番に信号を送信するよりも多くがあるかどうか疑われます。POSIX はkill(1)次のように定義されます。したがって、再試行は仕様に違反しているようです。

これ殺すユーティリティーは、指定された各プロセスにシグナルを送信する必要があります。PIDオペランド。

それぞれPIDオペランド、殺す公益事業会社は、次の措置を講じる必要があります。殺す()機能

SIGHUPまた、すべてのシグナルがプロセスを終了するわけではなく、一部のシグナル(例:言及しないSIGUSR1)はプログラムごとに異なる意味を持つ可能性があることに注意してください。再試行のタイミングを知るための明確な方法はありませんが、最初に送信してから使用するkill方法はあります。SIGTERMSIGKILL

与えられた順序で信号を送信するのは簡単です。これがBashがkillすることです:

$ strace -etrace=kill bash -c 'kill -0 33330 33339 33335 33332 33337' |& grep ^'kill('
kill(33330, SIG_0)                      = -1 ESRCH (No such process)
kill(33339, SIG_0)                      = -1 ESRCH (No such process)
kill(33335, SIG_0)                      = -1 ESRCH (No such process)
kill(33332, SIG_0)                      = -1 ESRCH (No such process)
kill(33337, SIG_0)                      = -1 ESRCH (No such process)

答え2

kill <PID list>指定されたプロセスリストに指定された信号を送信します。次に、システムの動作は、特定のプロセスがその特定の信号を無視するかどうかに依存します。デフォルトではkillTERM 信号が送信されます。

ここでSIGKILLについて話していると仮定すると、信号をブロックまたは無視することはできません。したがって、リストされたプロセスは、kill -9何らかの理由で応答しない限り(ブロックされたNFSからのI / Oを待機している場合など)、終了します。

答え3

私たちは簡単に見て、この質問に答えることができます。kill.c

基本的に我々は:

  • struct proc_processes を使用したすべてのプロセスのリストps = proc_open_processes(); 次に、そのリストをpidまたはプロセス名でフィルタリングして送信します。

  • 見つかった各プロセスに対して kill_verbose(&ctl) を実行します。簡単です。 殺す(ctl->pid、ctl->numsig)

SIGKILL によってプロセスが終了すると終了します。 ~から信号.h:

terminate   - kill the process, i.e. all threads in the group,
      similar to exit_group.  The group leader (only) reports
      WIFSIGNALED status to its parent.

ご覧のとおり、これは単に「処理するメッセージを送信する」コマンドです。素晴らしいことはありません。

関連情報