kill 0は実際に何をしますか?[閉まっている]


22

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に使用されますpid。私が理解したようkill 0に、現在のプロセス内のすべてのプロセスを強制終了しますpid15247。これにはが含まれます。ただし、この例では何もしませんでした。誰かがそれを使用する方法についてのアイデアを持っていますか?


SIGTERM実行したプロセスにを送信します。manコマンドは、それを無視することを選択しました。
ヨルダン

5
@jordanm、いいえ。対話型シェルによって開始されたジョブには、シェルとは異なるプロセスグループがあります。これが、シェルがフォアグラウンドとバックグラウンドに配置する方法です。ps -jプロセスグループを参照してください。
ステファンシャゼル

1
この質問は、実際にはスーパーユーザーの質問のコピーです。実際にkill 0は何をしますか?(StackOverflowから移行されました)。StackOverflowUnix.SEのkill -0別のトピックである(ダッシュに注意)に関する質問も参照してください。
アダム・カッツ

回答:


27

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

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

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

これはプロセスグループで実現されます。ジョブは、シェルによって開始されたプロセスのグループであり、シェルはこれをバックグラウンドまたはフォアグラウンドに入れて(ターミナルのフォアグラウンドプロセスグループとして設定するかどうか)、全体を強制終了できます。

あなたはプロセスグループIDとセッションIDを知ることができますps -jjのためのJOB制御)。

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

上記の、sleepそしてps二つの異なるプロセス・グループ、バックグラウンドで1、前景の一つにあり、彼らは、シェルのプロセスグループとは異なります。

あなたもできます:

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

対話型シェルはそのサブシェルの新しいプロセスグループを開始し、サブシェルとman(およびページャー、groff ...などの人間が開始する他のコマンド)は同じプロセスグループ内にあるため、そこでkill 0動作します。(sleep上記は、ページャーを開始するのに十分な時間を与えて、ページャーを強制終了するps -j前に出力で確認できるようにすることです)。


kill -- -$xbash: kill: (-63531) - No such processMacOS 10.14のbash 5.0.11(1)-releaseで実際に述べていますが、プロセスが存在し実行されていることは確かです。pkill -P
正常に

1
@kyb $ xは、プロセスIDではなくプロセスグループIDでなければなりません。出力を参照してくださいps -jのPGIDを知るために
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.