¿Cómo matar tanto el proceso como el subproceso?

9

Hice una pregunta para saber cómo obtener múltiples líneas de mensaje desde el módulo de subproceso de Python.

El problema es que en el transcurso de las pruebas, tuve que matar el proceso de Python que ejecuta el proceso gnuchess. El uso de ^ c en la línea de comando parece matar el proceso de Python, pero no el proceso gnuprocess.

Por matar gnuchess, recibo el pid con ps aux | grep gnuchess y ejecuta kill -9 PID . ¿Hay otros métodos para matar el proceso de Python y Gnuchess?

prosseek
fuente
8
Sidenote al azar: Se puede utilizar pkillpara matar a un proceso por el nombre, por lo que su ps aux | grep gnuchessy kill -9 PIDsolo puede llegar a serpkill -9 gnuchess
Michael Mrozek

Respuestas:

10

Existe un método estándar, si los programas cooperan. Ejecute kill -- -42donde 42 es el pid del proceso padre. Esto envía una señal a todos los procesos en el grupo de procesos liderados por el proceso 42 (el signo menos antes del pid significa grupo de procesos).

Normalmente, si ejecuta su script de Python desde un indicador de comandos de shell y simplemente se bifurca gnuchess, los dos procesos deben permanecer en el mismo grupo de procesos. Pero este no parece ser el caso, ya que Ctrl+ Cenvía SIGINTa todo el grupo de procesos en primer plano.

Gnuchess podría estar en su propio grupo de procesos porque se convirtió en un líder de sesión (pero no sé por qué haría esto), o porque lo bifurcaste dos veces (python bifurca un caparazón que bifurca a gnuchess). Probablemente se pueda evitar una doble bifurcación, pero no puedo decirte cómo sin ver tu código.


Una forma razonablemente confiable y compatible con POSIX de encontrar el pid del gnuchessproceso es

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

Las variantes específicas de Unix pueden tener mejores formas de lograr esto, como pgrep.

Gilles 'SO- deja de ser malvado'
fuente
0

Tratar:

pkill <processname>
Dilema
fuente