web-dev-qa-db-ja.com

bashスクリプトによって作成されたプロセスを強制終了する最良の方法は?

サーバーでスクリプトを実行していて、多くのサブプロセス(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が多数ある場合、最善かつ最速の方法は何ですか?

4
prado

やってみました pkill -signal -P ppid

Pkillマニュアルから:

pkill-名前およびその他の属性に基づいてプロセスを検索またはシグナル通知する

-signal一致した各プロセスに送信するシグナルを定義します

-P ppid親プロセスIDがリストされているプロセスのみに一致します

2432とそのすべての子を殺したい場合は、最初にpkill -15 -P 2432、それが機能せず、核オプションを使用する場合:pkill -9 -P 2432

3
Schives

私は少し研究をしました、そして私は少しの説明が他の人を助けると思います。

@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
2
prado

スクリーンセッションをquitしようとすると、その時点で子プロセスが強制終了されます。

例えば:

screen -X -S website_status quit
0
David Bobb