サーバーでスクリプトを実行していて、多くのサブプロセス(800程度)が作成されます。全部一気に殺したい。以下はps
情報です。
root 26363 0.0 0.0 119216 1464 ? Ss Mar02 0:00 SCREEN -S website_status
root 26365 0.0 0.0 108472 1844 pts/12 Ss Mar02 0:00 \_ /bin/bash
root 4910 0.0 0.0 161684 1956 pts/12 S Mar02 0:00 \_ su webmon
webmon 4939 0.0 0.0 108472 1924 pts/12 S+ Mar02 0:00 \_ bash
webmon 1094 3.4 0.0 107256 2432 pts/12 S 05:37 2:26 \_ sh /home/webmon/scripts/for_html/website/website_status.sh
webmon 5159 0.0 0.0 100956 1288 pts/12 S 05:37 0:00 \_ mysql -vvv -h 192.168.12.38 -uwebmon -px xxxxxxxxxxxxx -e show processlist;
webmon 5160 0.0 0.0 103252 816 pts/12 S 05:37 0:00 \_ grep in set
webmon 5161 0.0 0.0 105952 900 pts/12 S 05:37 0:00 \_ awk {print $1}
webmon 12094 0.0 0.0 100956 1288 pts/12 S 05:37 0:00 \_ mysql -vvv -h 192.168.12.38 -uwebmon -px xxxxxxxxxxxxx -e show processlist;
webmon 12095 0.0 0.0 103252 820 pts/12 S 05:37 0:00 \_ grep Sleep -c
webmon 15044 0.0 0.0 60240 3004 pts/12 S 05:37 0:00 \_ ssh -q 192.168.12.38 uptime | grep -o load.* | cut -f2 -d:
webmon 15166 0.0 0.0 100956 1292 pts/12 S 05:37 0:00 \_ mysql -vvv -h 192.168.12.38 -uwebmon -px xxxxxxxxxxxxx -e show processlist;
webmon 15167 0.0 0.0 103252 816 pts/12 S 05:37 0:00 \_ grep in set
webmon 15168 0.0 0.0 105952 900 pts/12 S 05:37 0:00 \_ awk {print $1}
webmon 18484 0.0 0.0 100956 1288 pts/12 S 05:38 0:00 \_ mysql -vvv -h 192.168.12.38 -uwebmon -px xxxxxxxxxxxxx -e show processlist;
webmon 18485 0.0 0.0 103252 816 pts/12 S 05:38 0:00 \_ grep in set
webmon 18486 0.0 0.0 105952 900 pts/12 S 05:38 0:00 \_ awk {print $1}
webmon 25110 0.0 0.0 60240 3008 pts/12 S 05:38 0:00 \_ ssh -q 192.168.12.38 uptime | grep -o load.* | cut -f2 -d:
webmon 2598 0.0 0.0 100956 1292 pts/12 S 05:38 0:00 \_ mysql -vvv -h 192.168.12.38 -uwebmon -px xxxxxxxxxxxxx -e show processlist;
webmon 2599 0.0 0.0 103252 816 pts/12 S 05:38 0:00 \_ grep in set
webmon 2600 0.0 0.0 105952 900 pts/12 S 05:38 0:00 \_ awk {print $1}
スクリプトの強制終了はうまくいきませんでした。ここにsub-processが多数ある場合、最善かつ最速の方法は何ですか?
やってみました pkill -signal -P ppid
?
Pkillマニュアルから:
pkill-名前およびその他の属性に基づいてプロセスを検索またはシグナル通知する
-signal一致した各プロセスに送信するシグナルを定義します
-P ppid親プロセスIDがリストされているプロセスのみに一致します
2432とそのすべての子を殺したい場合は、最初にpkill -15 -P 2432
、それが機能せず、核オプションを使用する場合:pkill -9 -P 2432
。
私は少し研究をしました、そして私は少しの説明が他の人を助けると思います。
@Schives answered のように、PPIDを使用すると、すべての子プロセスと親プロセスを終了できます。
しかし、PPID
を簡単に取得する方法は?
ps -o pid,ppid,sess,cmd -U webmon
または
root@87-109:~$ ps -o pid,ppid,sess,cmd -U webmon | grep 'website_status.sh\|PID'
PID PPID SESS CMD
16848 16787 16787 sh website_status.sh
17667 4405 4405 grep --color=auto website_status.sh\|PID
root@87-109:~$
その後、pkill -15 -P 16787
ここでwebmonはプロセスを実行しているユーザーです。
blog で親プロセスと子プロセスを強制終了する他の方法を見つけました。ここに貼り付けています。
これにはPID,PPID,PGID,GID
と取得方法
ps -o pid,ppid,pgid,gid,sess,cmd -U username
1。負のPID(プロセスID)を持つプロセスのグループを強制終了します
kill -TERM -PID
PIDとそのすべての子プロセスを強制終了することです。
2。 PGID(プロセスグループID)でプロセスのグループを強制終了します
kill -- -$PGID Kill using the default signal (TERM = 15)
kill -9 -$PGID Kill using the KILL signal (9)
3。 PID情報のみを持つグループプロセスを強制終了します
kill -- -$(ps -o pgid= $PID | grep -o [0-9]*)
実際には、それが#2からの道のりであることに気付くかもしれません
4。 pkillを使用して、PGID(プロセスグループID)でプロセスを強制終了します
pkill -9 -g $PGID
5。 pkillを使用して、GID(グループID)でプロセスを強制終了します
pkill -9 -G $GID
6。 pkillを使用して、PPID(親プロセスID)でプロセスを強制終了します
pkill -9 -p $PPID
7。 pkillを使用して、ターミナルでプロセスを強制終了します
pkill -9 -t $terminal
注:/ dev /接頭辞なし
8。 pkillを使用して、プロセス名でプロセスを強制終了します
pkill -9 -x $process_name
9。 pkillを使用して、セッションごとにプロセスを強制終了します
pkill -9 -s $sess
スクリーンセッションをquit
しようとすると、その時点で子プロセスが強制終了されます。
例えば:
screen -X -S website_status quit