我有一个在服务器中运行的脚本,它将创建许多子进程(大约 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.杀死一组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
你有没有尝试过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