【问题标题】:Kill bash and child process杀死 bash 和子进程
【发布时间】:2014-04-12 15:24:03
【问题描述】:

我的 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),但 find 进程 (7803) 仍然继续执行。如何确保 bash 进程将信号传播给它的子进程?

【问题讨论】:

    标签: c linux bash signals


    【解决方案1】:

    它将向传入参数的进程组 ID 和所有子进程发送一个 SIGTERM。

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

    另外,关于这篇文章的更多答案:Best way to kill all child processes

    【讨论】:

    • 它向进程$PID_OF_TEST和所有子进程发送一个TERM信号
    • 在这种情况下,-- 告诉下一个- 被视为负号而不是标志。我试过这个但错误地使用了kill -- $PID(错过了最后的-)。
    • 这不太适合我。 kill 正在返回 ESRCH(没有这样的过程)。
    • 我必须setsid()execing bash 之前在孩子中创建一个新会话。现在一切正常。
    【解决方案2】:

    来自man 2 kill

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

    也就是说,您可以杀死所有未创建自己的进程组的直接或间接子进程。

    【讨论】:

      猜你喜欢
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      相关资源
      最近更新 更多