ちょっとした作業で、親プロセスIDを指定して子プロセスを再帰的にkillしたいということがあったので、その備忘。
特定のプロセスをkillする場合だと、よくpgrepを使ってプロセスidを取得してそこからkillさせていたのだが、それだと子プロセスが残ってしまう。
でどうすればよいのかと調べたところ、pgrepやpkillでは-g
オプションを付与することで全プロセスIDを取得・指定できるので、それを利用すれば良い。
pgrep -g $(pgrep 親プロセス名) # 子プロセスを含め、すべてのプロセスを取得する
pkill -g $(pgrep 親プロセス名) # 子プロセスを含め、すべてのプロセスをkillする
pkill -KILL -g $(pgrep 親プロセス名) # 子プロセスを含め、すべてのプロセスをkillする
[root@BS-PUB-CENT7-01 ~]# ps -ef | grep [s]ql
root 8532 10179 0 14:28 pts/0 00:00:00 /bin/sh /usr/bin/mysqld_safe --skip-grant-tables
mysql 8687 8532 0 14:28 pts/0 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --skip-grant-tables --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
[root@BS-PUB-CENT7-01 ~]# pgrep -g $(pgrep mysqld_safe)
8532
8687
ちなみに、親プロセスを正常終了させるのであれば、以下のようにコマンドを実行してやれば良い。
pkill -TERM -P $(pgrep mysqld_safe)