我的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进程将信号传播给它的孩子?
答案 0 :(得分:2)
它会将SIGTERM发送到参数中传递的进程组ID以及所有子进程。
kill -- -$(ps -o pgid= $PID | grep -o [0-9]*)
此帖还有更多答案:Best way to kill all child processes
答案 1 :(得分:2)