JP / EN

広告
2025/07/14

kill -0 [PID] と kill 0: プロセス生存確認とプロセスグループをまとめて終了

タグ:linux

Linuxコマンドでkillに"ゼロ"をオプションとして渡すときは
  • kill -0 [PID] : プロセスが生存しているか確認/li>
  • kill 0: プロセスグループ全体を終了させる
と、2つのちょっとややこしい異なる使い方がある。
Google検索の仕様上ハイフンが検索しにくくどちらで検索しようとしてもどちらも引っかかってしまうと気づいた。 せっかくなのでどちらを探している人が、着てもよいように kill -0 [PId] と kill 0 の両方の使い方をまとめて紹介する。

kill -0 [PID] : プロセスが生存しているか確認

有無を言わさぬ強制終了コマンドとしてkill -9 [PID]が有名だが、このようにハイフンの後に数値で killの殺意レベル(笑)を表現する考えがあり、その中で最弱レベルの-0を実際にはプロセスを終了させずに 生きているか確認する意味を0に当てはめたのだろう。
なお、kill -0 [PID]はプロセスに実際はシグナルを送ることすらしないので、ゾンビ化するなどして 応答しなくなったプロセスに対しても正常終了することは注意。
    $ sleep 100 & # バックグラウンドで確認対象プロセスを起動
    [1] 1195
    $ ps
      PID TTY          TIME CMD
      17 tty1     00:00:00 bash
    1195 tty1     00:00:00 sleep
    1196 tty1     00:00:00 ps
    # 確かにいる
    $ kill -0 1195  # プロセスが生存しているときは正常終了。出力はなし
    $ kill -0 1195  # 2回やっても同じ、実際にはkillしないため
    $ kill -0 1198
    -bash: kill: (1198) - No such process   # プロセスが存在しないときはエラー
  



kill 0: 同プロセスグループ内のプロセス全てをkill

ハイフン意味で大きく意味が異なり、UNIX/Linuxにおいてではあるが こちらは実際にプロセスグループにkillを投げるので注意が必要だ。 プロセスグループとは単一のコマンド・スクリプトやパイプで繫がれて起動された一連のプロセスのことである。 なお単に同一のシェルセッションから起動されただけではプロセスグループは形成されないので、 ここではサブシェルでグループを作り試してみる。
    $(  # ここからサブシェル
    $  sleep 100 &
    $  sleep 100 &
    $  sleep 100 &
    # 3つのsleepをバックグラウンドで起動

    $  jobs -l   # PIDを確認

    $  sleep 3
    $  kill 0

    $  jobs -l
    $)
    [1]   1230 Running                 sleep 100 &
    [2]-  1231 Running                 sleep 100 &
    [3]+  1232 Running                 sleep 100 &
    Terminated  # kill された

    $ ps
      PID TTY          TIME CMD
      17 tty1     00:00:00 bash
      1233 tty1     00:00:00 ps
      # sleepは確かにみんな終了している
      
というようにいちいちPIDを指定することなく同じプロセスグループ内の全てのプロセスを終了させることができ便利である。



おすすめ記事

Pythonからシェルコマンドをsubprocessとして呼びだす

"chown nobody:nogroup"の意味:nobodyという特殊ユーザの用途

"unlink: cannot unlink 'link/': Is a directory" unlinkにスラッシュを付けてはいけない



このエントリーをはてなブックマークに追加

https://wonderhorn.net/