pkill 名前などの条件に合うプロセスにシグナルを送る
pkill [オプション] パターン試してみる
pgrep -a -x sleep対象になるプロセスを先に確認します。pkill と pgrep は同じ条件で探せます。
pkill -f '^sleep 100001'コマンドライン全体(引数も含む)が一致するプロセスだけに SIGTERM を送ります。
sleep 1; pgrep -a -x sleep100001 だけが消えて、残りの2つは動いています。
pkill -u user -n -x sleepユーザー user の sleep のうち、いちばん新しく起動した1つだけを終了させます。
pkill -9 -x sleep名前が完全に sleep のプロセスすべてを SIGKILL で終了させます。
sleep 1; pgrep -x sleep || echo 残っていません該当するプロセスがなくなったことを確認します。
主なオプション
-シグナル | 送るシグナルを指定する(-9、-HUP など)。省略すると SIGTERM |
|---|---|
-x | プロセス名が完全に一致するものだけを対象にする |
-f | プロセス名ではなくコマンドライン全体と照合する |
-u ユーザー | 指定したユーザーのプロセスだけを対象にする |
-n | 一致したうち、最も新しく起動したものだけを対象にする |
-o | 一致したうち、最も古く起動したものだけを対象にする |
-t 端末 | 指定した端末のプロセスだけを対象にする |
解説
pkill は部分一致
pkill パターン は、プロセス名にパターンを含むプロセスすべてに、シグナルを送ります。部分一致なので、pkill ssh は sshd や ssh-agent にも当たります。誤爆を避けるには、まず pgrep -a で同じ条件を使って対象を確認します。名前を完全一致にしたいときは -x を付けます。
名前か、コマンドライン全体か
既定で照合するのは、プロセス名(ps の COMM 列にあたる、先頭15文字まで)だけです。引数の違いで区別したいときは -f を使うと、sleep 100001 のようなコマンドライン全体と照合します。-f では、パターンが正規表現として扱われます。
kill との違い
kill は PID を指定しますが、pkill は名前や所有者などの条件で選びます。シグナルの指定の書き方は kill と同じです。何も指定しなければ SIGTERM(15)が送られます。一致するプロセスが1つもないと、終了コード 1 を返します。
killall との違い
killall は名前が完全に一致するプロセスが対象です。pkill は既定では部分一致で、-u や -t などの条件も組み合わせられます。