杀死bash和子进程

时间:2014-04-12 15:24:04

标签: c linux bash signals

我的C程序在bash shell中执行命令。为此,我fork并在子流程中运行:

char* command = "..."; /* provided by user */
execlp("/bin/bash", "bash", "-c", command, NULL);

如果这是一个长时间运行的命令,我想有杀死它的选项。例如,说我正在做:

execlp("/bin/bash", "bash", "-c", "find / test", NULL);

在此之后,我知道正在执行bash的子进程的PID,但是bash正在分支执行find的单独进程。

$ ps aux | grep find
zmb       7802  0.0  0.1   5252  1104 pts/1    S+   11:17   0:00 bash -c find / test
zmb       7803  0.0  0.0   4656   728 pts/1    S+   11:17   0:00 find / test

我可以杀死bash进程(7802),但是查找进程(7803)仍然继续执行。如何确保bash进程将信号传播给它的孩子?

2 个答案:

答案 0 :(得分:2)

它会将SIGTERM发送到参数中传递的进程组ID以及所有子进程。

kill -- -$(ps -o pgid= $PID | grep -o [0-9]*)

此帖还有更多答案:Best way to kill all child processes

答案 1 :(得分:2)

来自man 2 kill

如果pid小于-1,则将sig发送到ID为-pid的进程组中的每个进程。

那就是你可以杀死所有未创建自己的进程组的直接或间接的孩子。