Убить баш и дочерний процесс

Моя C программа выполняет команды в оболочке bash. Для этого я fork и в дочернем процессе я запускаю:

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

Если это длительная команда, я бы хотел ее убить. Например, скажите, что я делаю:

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

После этого я знаю PID дочернего элемента, выполняющего bash, но bash создает отдельный процесс для выполнения поиска.

$ 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 ответа

Решение

Он отправит SIGTERM идентификатору группы процессов, переданному в параметре, и всем дочерним элементам.

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

Кроме того, больше ответов на этот пост: лучший способ убить все дочерние процессы

От man 2 kill:

Если pid меньше -1, то sig отправляется каждому процессу в группе процессов с идентификатором -pid.

То есть вы можете убить всех детей, прямых или косвенных, которые не создали свою собственную группу процессов.

Другие вопросы по тегам