终止 bash 脚本创建的进程的最佳方法?

终止 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}

仅杀死脚本不起作用,如果我有很多脚本,最好和最快的方法是什么子流程这里?

答案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

相关内容