Linux便利コマンド : pgrep/pkill

うめだ
2025-06-20
2025-06-20
目次

はじめに

みなさま、pgrep、pkillコマンドはご存じでしょうか。

現在実行中のプロセスから引数に指定したパターンに一致するプロセス名を検索および終了させるコマンドです。

サーバー運用の中で、バックアップ等の処理を定期的に実行させることがあるかと思います。
その処理がなんらかの原因で正常終了しないまま、プロセスが大量に起動してしまうことがあります。

※本来は、定期実行する際は該当処理が実行中でないかをチェックするロジックをいれて、然るべき処理をさせるべきですけれども

そんなとき、該当処理のプロセスIDを特定して、一撃で強制終了させることができますので、紹介します。

環境

OS : AlmaLinux 8
pgrep/pkillバージョン : 3.3.15

使い方

詳細については、manコマンドにてマニュアルを参照ください。以下、一部を紹介します。

 pgrep [オプション] pattern
 pkill [オプション] pattern

オプション

-シグナル マッチした各プロセスに送信するシグナルを定義します。(pkillのみ)
-d, --delimiter delimiter 出力の各プロセスIDを区切る文字列を設定します(デフォルトは改行)。 (pgrepのみ)。
-u, --euid euid,... 実効ユーザーIDがリストされているプロセスにのみマッチする。 数値でも記号でもよい。
-l, --list-name プロセスIDとプロセス名をリストします。 (pgrep のみ)。
-a, --list-full プロセスIDの他にコマンド行を全てリストします。 (pgrep のみ)。


では、試していきましょう。

対象のプロセスとして、sleepコマンドを実行しておきます。

# for TGT in {1..10}; do sleep 1000 & done

パターンとして、sleepを指定して実行します。

# pgrep sleep
1298397
1298398
1298399
1298400
1298401
1298402
1298403
1298404
1298405
1298406
#

マッチしたプロセスのプロセスIDが表示されます。想定通りのプロセス(sleep)がリストされているのかわからないので、オプション:-l を付けて実行してみましょう。

# pgrep -l sleep
1298397 sleep
1298398 sleep
1298399 sleep
1298400 sleep
1298401 sleep
1298402 sleep
1298403 sleep
1298404 sleep
1298405 sleep
1298406 sleep
#

プロセスIDとあわせて、プロセス名も表示されますので、想定通りリストアップされたことが確認できます。

次に、オプション:-a を付けて実行してみましょう。

# pgrep -a sleep
1298397 sleep 1000
1298398 sleep 1000
1298399 sleep 1000
1298400 sleep 1000
1298401 sleep 1000
1298402 sleep 1000
1298403 sleep 1000
1298404 sleep 1000
1298405 sleep 1000
1298406 sleep 1000
#

コマンド行含めて表示されますので、sleepコマンドに指定した引数まで表示させることができます。

では、hogehogeユーザーで、別途sleepコマンドを実行します。

# for TGT in {1..10}; do sudo -u hogehoge /usr/bin/sleep 2000 & done

この状態で、psコマンドを実行してみると、rootユーザー、hogehogeユーザー、それぞれでsleepコマンドが実行されていることが確認できます。

# ps auxwwf | grep sleep
root     1298397  0.0  0.0   5488   924 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298398  0.0  0.0   5488   852 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298399  0.0  0.0   5488   892 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298400  0.0  0.0   5488   848 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298401  0.0  0.0   5488   932 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298402  0.0  0.0   5488   896 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298403  0.0  0.0   5488   928 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298404  0.0  0.0   5488   928 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298405  0.0  0.0   5488   836 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298406  0.0  0.0   5488   928 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298472  0.0  0.4 132648  7556 pts/1    S    04:41   0:00                              \_ sudo -u hogehoge /usr/bin/sleep 2000
hogehoge 1298487  0.0  0.0   5488   852 pts/1    S    04:41   0:00                              |   \_ /usr/bin/sleep 2000
root     1298473  0.0  0.4 132648  7596 pts/1    S    04:41   0:00                              \_ sudo -u hogehoge /usr/bin/sleep 2000
hogehoge 1298486  0.0  0.0   5488   932 pts/1    S    04:41   0:00                              |   \_ /usr/bin/sleep 2000
root     1298474  0.0  0.4 132648  7656 pts/1    S    04:41   0:00                              \_ sudo -u hogehoge /usr/bin/sleep 2000
hogehoge 1298483  0.0  0.0   5488   848 pts/1    S    04:41   0:00                              |   \_ /usr/bin/sleep 2000
root     1298475  0.1  0.4 132648  7688 pts/1    S    04:41   0:00                              \_ sudo -u hogehoge /usr/bin/sleep 2000
hogehoge 1298482  0.0  0.0   5488   932 pts/1    S    04:41   0:00                              |   \_ /usr/bin/sleep 2000
root     1298476  0.0  0.4 132648  7592 pts/1    S    04:41   0:00                              \_ sudo -u hogehoge /usr/bin/sleep 2000
hogehoge 1298490  0.0  0.0   5488   844 pts/1    S    04:41   0:00                              |   \_ /usr/bin/sleep 2000
root     1298477  0.0  0.4 132648  7668 pts/1    S    04:41   0:00                              \_ sudo -u hogehoge /usr/bin/sleep 2000
hogehoge 1298488  0.0  0.0   5488   940 pts/1    S    04:41   0:00                              |   \_ /usr/bin/sleep 2000
root     1298478  0.0  0.4 132648  7688 pts/1    S    04:41   0:00                              \_ sudo -u hogehoge /usr/bin/sleep 2000
hogehoge 1298484  0.0  0.0   5488   936 pts/1    S    04:41   0:00                              |   \_ /usr/bin/sleep 2000
root     1298479  0.0  0.4 132648  7672 pts/1    S    04:41   0:00                              \_ sudo -u hogehoge /usr/bin/sleep 2000
hogehoge 1298489  0.0  0.0   5488   860 pts/1    S    04:41   0:00                              |   \_ /usr/bin/sleep 2000
root     1298480  0.0  0.4 132648  7684 pts/1    S    04:41   0:00                              \_ sudo -u hogehoge /usr/bin/sleep 2000
hogehoge 1298485  0.0  0.0   5488   928 pts/1    S    04:41   0:00                              |   \_ /usr/bin/sleep 2000
root     1298481  0.0  0.4 132648  7644 pts/1    S    04:41   0:00                              \_ sudo -u hogehoge /usr/bin/sleep 2000
hogehoge 1298491  0.0  0.0   5488   836 pts/1    S    04:41   0:00                              |   \_ /usr/bin/sleep 2000
root     1298493  0.0  0.0  10316  1080 pts/1    S+   04:41   0:00                              \_ grep --color=auto sleep
#

では改めて、pgrepを実行してみます。

# pgrep -a sleep
1298397 sleep 1000
1298398 sleep 1000
1298399 sleep 1000
1298400 sleep 1000
1298401 sleep 1000
1298402 sleep 1000
1298403 sleep 1000
1298404 sleep 1000
1298405 sleep 1000
1298406 sleep 1000
1298482 /usr/bin/sleep 2000
1298483 /usr/bin/sleep 2000
1298484 /usr/bin/sleep 2000
1298485 /usr/bin/sleep 2000
1298486 /usr/bin/sleep 2000
1298487 /usr/bin/sleep 2000
1298488 /usr/bin/sleep 2000
1298489 /usr/bin/sleep 2000
1298490 /usr/bin/sleep 2000
1298491 /usr/bin/sleep 2000
#

すべてのsleepコマンドがリストアップされているので、hogehogeユーザーで実行されているsleepコマンドに絞って、リストアップさせてみましょう。

# pgrep -a -u hogehoge sleep
1298482 /usr/bin/sleep 2000
1298483 /usr/bin/sleep 2000
1298484 /usr/bin/sleep 2000
1298485 /usr/bin/sleep 2000
1298486 /usr/bin/sleep 2000
1298487 /usr/bin/sleep 2000
1298488 /usr/bin/sleep 2000
1298489 /usr/bin/sleep 2000
1298490 /usr/bin/sleep 2000
1298491 /usr/bin/sleep 2000
#

hogehogeユーザーのプロセスのみリストアップされましたね。では、pkillコマンドで該当プロセスを一撃で終了させてみましょう。

# pkill -u hogehoge sleep

この状態で、psコマンドを実行してみると、hogehogeユーザーで実行されていたsleepコマンドが終了していることが確認できます。

# ps auxwwf | grep sleep
root     1298397  0.0  0.0   5488   924 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298398  0.0  0.0   5488   852 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298399  0.0  0.0   5488   892 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298400  0.0  0.0   5488   848 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298401  0.0  0.0   5488   932 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298402  0.0  0.0   5488   896 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298403  0.0  0.0   5488   928 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298404  0.0  0.0   5488   928 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298405  0.0  0.0   5488   836 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298406  0.0  0.0   5488   928 pts/1    S    04:40   0:00                              \_ sleep 1000
root     1298498  0.0  0.0  10316  1136 pts/1    S+   04:42   0:00                              \_ grep --color=auto sleep
#

強制終了が必要な場合は以下のように、-9 のシグナルを指定して実行もできるようになっています。

# pkill -9 -u hogehoge sleep


まとめ

いかがでしたか?

pgrep/pkillでの特定プロセスを一撃で終了させる方法の紹介でした。

是非とも活用ください。