ちょっとした作業で、親プロセス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)