Как убить как процесс, так и подпроцесс?

9

Я задал вопрос, чтобы узнать, как получить несколько строк сообщения из модуля подпроцесса Python.

Проблема в том, что в ходе тестирования мне пришлось убить процесс python, который запускает процесс gnuchess. Использование ^ c в командной строке убивает процесс python, но не gnuprocess.

За убийство гнусесс я получаю ps aux | grep gnuchess и запустить kill -9 PID . Существуют ли другие методы для уничтожения процессов как Python, так и Gnuchess?

prosseek
источник
8
Случайный sidenote: Вы можете использовать, pkillчтобы убить процесс по имени, так что вы ps aux | grep gnuchessи kill -9 PIDможете просто статьpkill -9 gnuchess
Майкл Мрозек

Ответы:

10

Существует стандартный метод, если программы сотрудничают. Запустите, kill -- -42где 42 - pid родительского процесса. Это посылает сигнал всем процессам в группе процессов, возглавляемой процессом 42 (знак минус перед pid означает группу процессов).

Обычно, если вы запускаете скрипт Python из командной строки и он просто разветвляется gnuchess, два процесса должны оставаться в одной группе процессов. Но, похоже, это не так, поскольку Ctrl+ Cотправляет SIGINTвсей группе процессов переднего плана.

Gnuchess может быть в своей собственной группе процессов, потому что он сделал себя лидером сеанса (но я не знаю, почему он это сделал), или потому что вы дважды его разветвили (python разветвляет оболочку, которая разветвляет gnuchess). Двойной вилки, вероятно, можно избежать, но я не могу сказать вам, как, не увидев ваш код.


Достаточно надежный и POSIX-совместимый способ найти pid gnuchessпроцесса

gnuchess_pids=$(ps -A -o pid= -o cmd= | awk '$2 ~ /(^|\/)gnuchess$/ {print $1}')

Определенные варианты Unix могут иметь лучшие способы достижения этого, такие как pgrep.

Жиль "ТАК - перестань быть злым"
источник
0

Пытаться:

pkill <processname>
затруднительное положение
источник