Linux
殺死由 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}
僅殺死腳本沒有成功,如果我在這裡有很多子程序,最好和最快的方法是什麼?
你試過
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