Убить баш и дочерний процесс
Моя 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.
То есть вы можете убить всех детей, прямых или косвенных, которые не создали свою собственную группу процессов.