サイトアイコン Lonely Mobiler

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
モバイルバージョンを終了