GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo finalizar un subproceso de python iniciado con shell=True

Utilice un grupo de procesos para habilitar el envío de una señal a todos los procesos de los grupos. Para eso, debe adjuntar una identificación de sesión al proceso principal de los procesos generados/secundarios, que es un shell en su caso. Esto lo convertirá en el grupo líder de los procesos. Ahora, cuando se envía una señal al líder del grupo de procesos, se transmite a todos los procesos secundarios de este grupo.

Aquí está el código:

import os
import signal
import subprocess

# The os.setsid() is passed in the argument preexec_fn so
# it's run after the fork() and before  exec() to run the shell.
pro = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
                       shell=True, preexec_fn=os.setsid) 

os.killpg(os.getpgid(pro.pid), signal.SIGTERM)  # Send the signal to all the process groups

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
p.kill()

p.kill() termina matando el proceso de shell y cmd todavía se está ejecutando.

Encontré una solución conveniente para esto:

p = subprocess.Popen("exec " + cmd, stdout=subprocess.PIPE, shell=True)

Esto hará que cmd herede el proceso de shell, en lugar de que el shell inicie un proceso secundario, que no se elimina. p.pid será la identificación de su proceso cmd entonces.

p.kill() debería funcionar.

Sin embargo, no sé qué efecto tendrá esto en tu tubería.


Linux
  1. Cómo administrar múltiples versiones de Python con Pyenv en Linux

  2. Cómo dockerizar aplicaciones de Python con Miniconda

  3. Cómo lidia Kali con el próximo fin de vida de Python 2

  4. Cómo usar la exportación con Python en Linux

  5. Cómo usar el comando `subproceso` con tuberías

Cómo instalar Flask con Python 3 en Ubuntu 18.04

Cómo ejecutar un comando de Shell con Python

Cómo trabajar con procesos en primer plano y en segundo plano en Linux

Cómo matar o terminar un proceso de Linux:la guía definitiva

Cómo instalar Python 2.7 en CentOS 7.1 o 6.7 con Anaconda

Cómo instalar Apache con Python Mod_wsgi en Debian 10