はじめに
みなさま、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での特定プロセスを一撃で終了させる方法の紹介でした。
是非とも活用ください。