Linux

殺死由 bash 腳本創建的程序的最佳方法?

  • March 15, 2017

我有一個在伺服器上執行的腳本,它將創建許多子程序(大約 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}

僅殺死腳本沒有成功,如果我在這裡有很多子程序,最好和最快的方法是什麼?

你試過pkill -signal -P ppid嗎?

從 pkill 手冊:

pkill - 根據名稱和其他屬性查找或發送信號程序

-signal 定義要發送到每個匹配程序的信號

-P ppid 只匹配列出了父程序ID的程序

如果你想殺死 2432 和它的所有孩子,你應該首先嘗試pkill -15 -P 2432,如果這不起作用並且你願意使用核選項:pkill -9 -P 2432.

我做了一些研究,我認為很少的解釋會對其他人有所幫助。

正如@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

其中webmon是執行該程序的使用者。

我在部落格中遇到了其他殺死父子程序的方法,我將它們粘貼在這裡。

這需要PID,PPID,PGID,GID以及如何獲得它們?

ps -o pid,ppid,pgid,gid,sess,cmd -U username

1.殺死一組PID為負的程序(程序ID)

kill  -TERM -PID

是殺死PID及其所有子程序。

2.用他們的PGID(Process Group 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(Proess Group ID)殺死程序

pkill -9 -g $PGID

5.使用pkill,按GID(Group ID)殺死程序

pkill -9 -G $GID

6.使用pkill,通過PPID(Parent Process 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

引用自:https://unix.stackexchange.com/questions/350676