多くのサブプロセス(約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}
スクリプトを殺すだけでは機能しません。スクリプトが多い場合、最良かつ最速の方法は何ですか?サブプロセスここ?
答え1
私はいくつかの研究をしてきたし、いくつかの説明が他の人に役立つと思います。
@Schivesが言ったように回答済み、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
どこネットワークモニタープロセスを実行するユーザーです。
親プロセスと子プロセスを終了する別の方法が見つかりました。ブログ、ここに貼り付けます。
要件は何でPID,PPID,PGID,GID
あり、どのように取得するのですか?
ps -o pid,ppid,pgid,gid,sess,cmd -U username
1. 負のプロセス ID (PID) を持つプロセスグループを終了します。
kill -TERM -PID
PIDとすべての子プロセスを終了します。
2.プロセスグループID(PGID)でプロセスグループを終了します。
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を使用してプロセスグループID(PGID)でプロセスを終了します。
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
試してみましたpkill -signal -P ppid
か?
pkillマニュアルから:
pkill - 名前やその他の属性に基づいてプロセスにシグナルを検索または送信します。
-signal は、一致する各プロセスに送信される信号を定義します。
-P ppidは、親プロセスIDがリストされているプロセスのみと一致します。
2432とその子どもを殺したい場合は、まず試してみてください。pkill -15 -P 2432
それでも効果がなく、核オプションを使用する意向がある場合は、次のようになりますpkill -9 -P 2432
。
答え3
画面セッションを試みると、quit
子プロセスは終了します。
たとえば、
screen -X -S website_status quit