😀

【便利なLinuxコマンド】pkill (同じプロセス名をまとめてkill)

2022/05/17に公開1

はじめに

みなさんプロセスをkillしてますでしょうか?

僕は毎日プロセスをkillしています。

いちいち「# ps -ef」でプロセスIDを確認して、「kill <プロセスID>」を繰り返すのって面倒ですよね。

そんなときpkillコマンドに出会ってから一気にストレスが無くなりました。

1つだけプロセスをkillする場合も、いちいちプロセスIDでなくプロセス名でkillできるので非常に快適です。
もうkillコマンドは使わずにpkillコマンドだけ使うようになりました。

使い方

# pkill <プロセス名>

これだけです。

実行例

大量実行用のプログラム準備

単純にCPUループするプログラムを以下で準備します。

# vi loop.c
int main()
{
        while(1);
}
# cc -o loop loop.c
# ls 
loop loop.c

単純にCPUループする「loop」実行プログラムができます。
※「cc」コマンドは「gcc」パッケージ含まれているコンパイラです。
 インストールされていない場合は「yum -y install gcc」などでインストールすると使えます。

プログラムを大量に実行するスクリプト準備

プログラムを大量に実行するスクリプトを準備します。

# vi run.sh
#! /bin/sh
cnt=0
while [ $cnt -ne 10 ]
do
        ./loop &
        cnt=`expr $cnt + 1`
        echo $cnt
done

このスクリプトで、さきほど作成したCPUループする「loop」プログラムが10回実行できます。
※実行する数を変更したい場合はwhile文の数字を調整してください。

loopプログラムを10個バックグラウンドで同時実行

事前に準備したプログラムとスクリプトで、同時にプロセスを大量に生成してみます。
負荷が高すぎて固まってしまう可能性もありますので、すぐにpkillできるように事前にpkillコマンドの練習は済ませておきましょう。

# ./run.sh
# ps -ef | grep loop
root       3065      1 19 22:42 pts/0    00:01:26 ./loop
root       3067      1 19 22:42 pts/0    00:01:26 ./loop
root       3069      1 19 22:42 pts/0    00:01:26 ./loop
root       3071      1 19 22:42 pts/0    00:01:26 ./loop
root       3073      1 19 22:42 pts/0    00:01:26 ./loop
root       3075      1 19 22:42 pts/0    00:01:26 ./loop
root       3077      1 19 22:42 pts/0    00:01:26 ./loop
root       3079      1 19 22:42 pts/0    00:01:26 ./loop
root       3081      1 19 22:42 pts/0    00:01:26 ./loop
root       3083      1 19 22:42 pts/0    00:01:26 ./loop
#

10個プロセスが動いています。

topコマンドでも見てみましょう。

# top 
top - 22:49:53 up  1:09,  3 users,  load average: 10.02, 8.78, 5.82
Tasks: 124 total,  11 running, 113 sleeping,   0 stopped,   0 zombie
%Cpu(s): 99.8 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.2 si,  0.0 st
KiB Mem :  1862996 total,  1500472 free,   196884 used,   165640 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1514408 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  3067 root      20   0    4212    352    280 R  20.3  0.0   1:34.39 loop
  3083 root      20   0    4212    356    280 R  20.3  0.0   1:34.15 loop
  3071 root      20   0    4212    352    280 R  19.9  0.0   1:34.19 loop
  3073 root      20   0    4212    352    280 R  19.9  0.0   1:34.16 loop
  3077 root      20   0    4212    352    280 R  19.9  0.0   1:34.25 loop
  3079 root      20   0    4212    352    280 R  19.9  0.0   1:34.32 loop
  3081 root      20   0    4212    356    280 R  19.9  0.0   1:34.11 loop
  3065 root      20   0    4212    356    280 R  19.6  0.0   1:34.40 loop
  3069 root      20   0    4212    352    280 R  19.6  0.0   1:34.19 loop
  3075 root      20   0    4212    356    280 R  19.6  0.0   1:34.35 loop

ちゃんと10個プロセスが動いていますね。

pkillコマンドでまとめてkill

それでは、pkillコマンドでまとめてkillしてみましょう。

# pkill loop
# ps -ef | grep loop
#

「loop」プロセスがすべて消えました。

topコマンドでも見てみましょう。

top - 22:56:17 up  1:16,  3 users,  load average: 1.26, 6.32, 6.02
Tasks: 114 total,   1 running, 113 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1862996 total,  1496072 free,   195116 used,   171808 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1516188 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  3120 root      20   0   58280   2072   1428 R   0.7  0.1   0:00.18 top
    30 root      20   0       0      0      0 S   0.3  0.0   0:04.41 kworker/0:1
     1 root      20   0  193552   6572   4060 S   0.0  0.4   0:02.34 systemd
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.01 kthreadd
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
     6 root      20   0       0      0      0 S   0.0  0.0   0:00.26 ksoftirqd/0
     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.07 migration/0
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh

やはりloopプロセスはすべて消えています。

参考

上記のCPUループのプログラムとスクリプトを組み合わせれば、簡単にサーバに負荷をかけることができます。
AWSのEC2とかでAutoScallingのテストするときにも便利に使えます。

注意点

pkillコマンドで指定する「プロセス名」は完全一致でない点に注意してください。

たとえば、「# pkill op」と「op」だけ指定しても、「loop」プロセスはkillされます。
つまり、うっかり短い文字を入力した時点でEnterを押してしまうと、その文字がヒットしたプロセスは全部消えてしまいます。
便利とはいえ、システムの本番環境の作業では使わないほうが安全ですね。

Discussion

kurageskurages

pkillコマンドで指定する「プロセス名」は完全一致でない点に注意してください。

(´・ω・)つ killall