杀死Linux中一个进程组的所有成员
介绍
作为一个Linux系统管理员,处理进程是一项频繁的任务。一般来说,它们很容易停止,然而在某些情况下–当同一组内有大量的进程时,可能需要额外的步骤。
我们将仔细研究如何使用 “组 “的概念来管理进程。另外,如何终止属于某个特定组的所有进程。
流程组
Linux中的进程分组是Linux进程共享相同PID(进程ID)的一种方式。它们是一组共享相同PID的相关进程。
杀死父母并不一定意味着孩子们也会被杀死。然而,如果我们杀死父母,他们就不会再运行了。因此,我们将看到杀死一个特定的pid(属于父母的那个)如何让我们停止其所有相关的pid。
每个进程组都有一个组长,他的进程ID(PGID)与该组的所有其他成员相同。
设置一个分组进程的列表
我们假设的情况是,有一个层次的应用程序在运行。因此,我们将编写三个程序,它们将相互调用,创建大量的子进程组。
让我们创建一个名为parent.sh的shell脚本,内容如下——。
#!/bin/bash
bash parent.sh &
bash parent.sh &
for i in {1..100}; do
sleep 2;
echo -n "This is the grandparent process $i";
done
现在让我们再添加一个名为parent.sh的脚本和一个名为children.sh的脚本。
#!/bin/bash
bash children.sh &
bash children.sh &
for i in {1..100}; do sleep 2; echo -n "This is the parent process i";
done
#!/bin/bash
for i in {1..100}; do
sleep 2;
echo -n "This is a test in children processi";
done
./grandparent.sh
使用ps命令查找进程组
我们将使用ps来获取当前运行的进程列表。
- -e – 选择所有进程
-
-f – 默认情况下,ps命令不显示全格式的列表和PGID以及额外的列作为选项。
-
-j – 以作业格式列出进程。
$ ps -efj
UID PID PPID PGID SID C STIME TTY TIME CMD
root 1 0 1 1 0 11:18 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
root 2 0 0 0 0 11:18 ? 00:00:00 [kthreadd]
root 3 2 0 0 0 11:18 ? 00:00:00 [rcu_gp]
root 4 2 0 0 0 11:18 ? 00:00:00 [rcu_par_gp]
root 6 2 0 0 0 11:18 ? 00:00:00 [kworker/0:0H]
root 8 2 0 0 0 11:18 ? 00:00:00 [mm_percpu_wq]
root 9 2 0 0 0 11:18 ? 00:00:00 [ksoftirqd/0]
root 10 2 0 0 0 11:18 ? 00:00:00 [rcu_sched]
过滤进程列表的输出
如果你的电脑里有多个进程在运行,可能需要对输出进行过滤。我们将研究使用一些工具来帮助我们确定我们要终止的进程的进程组ID(PGID)。
根据我们刚刚在第3节构建的设置,应该有一组具有相同PGID的进程。
$ ps -efj | egrep "PGID|children|parent"
UID PID PPID PGID SID C STIME TTY TIME CMD
vagrant 6389 5377 6389 5377 0 12:49 pts/0 00:00:00 bash grandparent.sh
vagrant 6390 6389 6389 5377 0 12:49 pts/0 00:00:00 bash parent.sh
vagrant 6391 6389 6389 5377 0 12:49 pts/0 00:00:00 bash parent.sh
vagrant 6393 6390 6389 5377 0 12:49 pts/0 00:00:00 bash children.sh
vagrant 6394 6390 6389 5377 0 12:49 pts/0 00:00:00 bash children.sh
vagrant 6395 6391 6389 5377 0 12:49 pts/0 00:00:00 bash children.sh
vagrant 6397 6391 6389 5377 0 12:49 pts/0 00:00:00 bash children.sh
vagrant 6440 4570 6439 4570 0 12:49 pts/1 00:00:00 grep -E --color=auto PGID|children|parent
第2节讨论了运行所有其他程序的第一个进程的PID。然后将这些PID分配给所有其他运行的程序。
使用PGID杀死一个进程
我们将使用kill命令通过向进程发送杀戮信号来终止它们。下面是一个我们如何执行kill命令的例子 —
kill -- -$PGID
两个破折号(–)代表默认的SIGTERM信号。根据图5,我们要杀死的这组进程的PGID是6389 知道了这一点,我们就知道可以通过使用 “kill “命令来杀死这组进程。
kill -- -6389
我们也可以使用我们通常对进程使用的信号。例如,如果我们想用SIGKILL -9来终止进程组,那么我们可以输入-
kill -9 -6389
SIGQUIT可以用来向一个组内的进程发送终端退出信号。
kill -SIGQUIT -6389
结论
我们学习了如何使用 “kill “命令来终止属于同一进程组的进程。你可以通过发送SIGTERM或SIG QUIT信号进行终止。使用这种方法杀死一个正在运行的程序可以解决大量程序不断运行的情况。一个程序需要被关闭。