【便利なLinuxコマンド】pkill (同じプロセス名をまとめてkill)
はじめに
みなさんプロセスを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
(´・ω・)つ
killall