Як вбити і процес, і підпроцес?


9

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

Проблема полягає в тому, що в ході тестування мені довелося вбити процес python, який запускає процес gnuchess. Використання ^ c у командному рядку, здається, знищує процес python, але не gnuprocess.

За вбивство гризуна я отримую під з ps aux | grep gnuchess і запустіть kill -9 PID . Чи існують інші способи вбивства як python, так і гнушного процесу?


8
Випадкова сторона: Ви можете використовувати pkillдля вбивства процес на ім'я, так що ваш ps aux | grep gnuchessі kill -9 PIDможе просто статиpkill -9 gnuchess
Michael Mrozek

Відповіді:


10

Існує стандартний метод, якщо програми співпрацюють. Виконати kill -- -42там, де 42 - під батьківського процесу. Це посилає сигнал усім процесам у групі процесів, що ведуть за допомогою процесу 42 (знак мінус перед підом означає групу процесу).

Як правило, якщо ви запускаєте скрипт python з підказки оболонки і він просто розщеплюється gnuchess, два процеси повинні залишатися в одній групі процесів. Але це, мабуть, не так, оскільки Ctrl+ Cнадсилає SIGINTвсю групу процесу переднього плану.

Gnuchess може бути у власній групі процесів, тому що він зробив себе лідером сеансу (але я не знаю, чому це було б зробити) або тому, що ви подвійно розщедрили його (python forks shell, який вилить gnuchess). Подвійну вилку, напевно, можна уникнути, але я не можу вам сказати, як не бачити код.


Досить надійним та POSIX-сумісним способом пошуку pid gnuchessпроцесу є

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

Конкретні варіанти Unix можуть мати кращі способи досягнення цього, наприклад pgrep.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.