Come uccidere sia il processo che il sottoprocesso?


9

Ho fatto una domanda per sapere come ottenere più righe di messaggio dal modulo di sottoprocesso di Python.

Il problema è che nel corso del test, ho dovuto interrompere il processo Python che esegue il processo Gnuchess. L'uso di ^ c nella riga di comando sembra uccidere il processo python, ma non lo gnuprocess.

Per aver ucciso la gnuchessa, ottengo il pid con ps aux | grep gnuchess ed esegui kill -9 PID . Ci sono altri metodi per uccidere sia il processo Python che Gnuchess?


8
Sidenote casuale: puoi usare pkillper uccidere un processo per nome, così il tuo ps aux | grep gnuchesse kill -9 PIDpuoi semplicemente diventarepkill -9 gnuchess
Michael Mrozek

Risposte:


10

Esiste un metodo standard, se i programmi cooperano. Esegui kill -- -42dove 42 è il pid del processo padre. Questo invia un segnale a tutti i processi nel gruppo di processi guidati dal processo 42 (il segno meno prima che il pid significhi gruppo di processi).

Normalmente, se si esegue lo script Python da un prompt della shell e semplicemente esegue il fork gnuchess, i due processi dovrebbero rimanere nello stesso gruppo di processi. Ma questo non sembra essere il caso, poiché Ctrl+ Cinvia SIGINTall'intero gruppo di processi in primo piano.

Gnuchess potrebbe essere nel suo gruppo di processi perché si è autoproclamato leader della sessione (ma non so perché lo farebbe), o perché l'hai biforcuto (Python forchette una shell che forgia gnuchess). Una doppia forcella è probabilmente evitabile, ma non posso dirti come senza vedere il tuo codice.


È un modo ragionevolmente affidabile e conforme a POSIX per trovare il pid del gnuchessprocesso

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

Specifiche varianti di unix possono avere modi migliori per raggiungere questo obiettivo, come ad esempio pgrep.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.