Kill 0は実際に何をしますか? [閉鎖]

Kill 0は実際に何をしますか? [閉鎖]

では、man page次のように言います。

kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
 pid... Specify the list of processes that kill should signal.  Each pid can be one of five things:
          0      All processes in the current process group are signaled

私はBashで次のことを試しました。

$ man kill &
[1] 15247
$
[1]+  Stopped                 man kill
$ kill 0
$ ps
15247 pts/41   00:00:00 man

ここではで0使用されますpidkill 0現在のプロセスを含む現在のプロセスのすべてのプロセスを終了しますpid15247。ただし、この例では何もしません。誰でもそれを使用する方法についてのアイデアはありますか?

答え1

言うように、呼び出し側のプロセスグループのすべてのメンバーにシグナルを送信します。

プロセスグループは、シェルでジョブ制御を実装するために使用されます(他の目的にも使用できますが、対話型シェルジョブ制御が存在する主な理由です)。

と入力すると、そのCtrl-Cジョブを開始したプロセスだけでなく、現在のジョブのすべてのプロセスが終了することがわかります。また、これによりバックグラウンドジョブは終了しません。

これはプロセスグループを通じて達成される。ジョブは、シェルによって開始されたプロセスグループで、バックグラウンドまたはフォアグラウンドに配置されるか(または端末のフォアグラウンドプロセスグループに設定されていない)、全体的に終了できます。

ps -jj(ob制御用)を使用して、JプロセスグループIDとセッションIDに関する情報を見つけることができます。

PGIDのプロセスグループを終了するには、次のように$xします。

kill -- "-$x"

kill 0呼び出し側のプロセスグループを終了します。

次のようにすると、/bin/kill 0シェルはkillコマンドを実行するために新しいタスクを開始するため、セルフkillシャットダウンのみが行われます。

kill通常、これはシェルに組み込まれているため、killシェルのプロセスグループを終了します。

ただし、シェルが対話型の場合、プロセスグループを管理するのはプロセスなので、通常、シェルのプロセスグループには他のプロセスはありません。シェルによって開始されたすべてのプロセスは別のプロセスグループにあります。

$ sleep 1000 &
[1] 22746
$ ps -j
  PID  PGID   SID TTY          TIME CMD
22735 22735 22735 pts/23   00:00:00 zsh
22746 22746 22735 pts/23   00:00:00 sleep
22749 22749 22735 pts/23   00:00:00 ps

上記とはsleep2psつの異なるプロセスグループ(バックグラウンドとフォアグラウンド)に属し、シェルのプロセスグループとは異なります。

しかし、次のようにすることができます。

(man kill & sleep 1; ps -j; kill 0)

インタラクティブシェルはサブシェル用の新しいプロセスグループを起動し、サブシェルとman(そして、pager、groffなどのmanが起動した他のコマンド)は同じプロセスグループにあり、そこでkill 0作業できます。 (上記は、ページャが終了する前に出力で確認できるsleepように、ページャに十分な開始時間を提供することです。)ps -j

関連情報