開発したアプリなど一覧

ps と grep, kill を組み合わせて特定のプロセスをまとめて強制終了するコマンド

とあるバッチ処理のスクリプトを運用しているのだが、偶に途中でフリーズしてしまう事がある。単に止まってしまうだけならまだしも CPU 使用率が 100% に達してしまうため、どうにかしないといけない。

本来であればスクリプトがフリーズする原因を特定して修正するべきだが、そこまでの時間が取れないので定期的にプロセスを落とす処理を記述した。忘れそうなのでブログに書いておこう。

利用したのは以下のコマンド。qiita にあった。

$ ps aux | grep プロセス名 | grep -v grep | awk '{ print "kill -9", $2 }' | sh

プロセス名でgrepした結果をkillするシェルスクリプトを作る - Qiita

このコマンドを実行すると「プロセス名」が入ったプロセスを強制終了できる。

どのような処理を行っているのか順に見てみよう。例として mysql を落としてみる。

まず ps aux でプロセスの一覧を出す。長いので一部省略している。

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   8892   188 ?        Ssl  Oct19   0:00 /init
ryomatsu   211  0.0  0.0  20604  8016 ?        Rs   Oct19   2:03 tmux
root      6103  0.0  0.0   8900   156 tty1     Ss   Oct21   0:00 /init
ryomatsu  6104  0.0  0.0  35832   504 tty1     Sl   Oct21   0:02 /mnt/c/apps/wsl-terminal/bin/wslbri
ryomatsu  6105  0.0  0.0 168284  2484 pts/0    Ss   Oct21   0:00 /usr/bin/fish
mysql      571  0.0  0.0  10660   644 ?        S    Oct25   0:00 /bin/sh /usr/bin/mysqld_safe
mysql      973  0.0  0.3 2131300 59756 ?       Sl   Oct25   0:01 /usr/sbin/mysqld --basedir=/usr --d
ryomatsu  5192  0.0  0.0  17380  1916 pts/3    R    10:32   0:00 ps aux

ps aux の結果から grep コマンドで目的のプロセスを探す。

$ ps aux | grep mysql
mysql      571  0.0  0.0  10660   644 ?        S    Oct25   0:00 /bin/sh /usr/bin/mysqld_safe
mysql      973  0.0  0.3 2131300 59756 ?       Sl   Oct25   0:01 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 --log-syslog=1 --log-syslog-facility=daemon --log-syslog-tag=
ryomatsu  5242  0.0  0.0  14804  1192 pts/3    S    10:33   0:00 grep --color=auto mysql

ただし grep -v を利用して grep 自身のプロセスは除外する。

$ ps aux | grep mysql | grep -v
mysql      571  0.0  0.0  10660   644 ?        S    Oct25   0:00 /bin/sh /usr/bin/mysqld_safe
mysql      973  0.0  0.3 2131300 59756 ?       Sl   Oct25   0:01 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 --log-syslog=1 --log-syslog-facility=daemon --log-syslog-tag=

awk コマンドでプロセス番号 $2(左から二番目の文字列) を抜き出し、プロセスを強制終了する kill -9 と組み合わせてコマンドを組み立てる。

$ ps aux | grep mysql | grep -v grep | awk '{ print "kill -9", $2 }'
kill -9 571
kill -9 973

組み立てたコマンドを sh に渡して実行する。なお mysql は別ユーザーで起動してるので sudo が必要。

$ ps aux | grep mysql | grep -v grep | awk '{ print "kill -9", $2 }' | sudo sh

再度 ps コマンドを実行して mysql が落ちたかどうか確認してみる。

$ ps aux | grep mysql
ryomatsu  5393  0.0  0.0  14804  1196 pts/3    S    10:35   0:00 grep --color=auto mysql

正常に動作しているようだ。

Sponsored Link

コメント

タイトルとURLをコピーしました