GNU/Linux >> Tutoriels Linux >  >> Linux

Comment tuer un processus enfant python créé avec subprocess.check_output() lorsque le parent meurt ?

Oui, vous pouvez y parvenir par deux méthodes. Les deux nécessitent que vous utilisiez Popen au lieu de check_output . La première est une méthode plus simple, utilisant try..finally, comme suit :

from contextlib import contextmanager

@contextmanager
def run_and_terminate_process(*args, **kwargs):
try:
    p = subprocess.Popen(*args, **kwargs)
    yield p        
finally:
    p.terminate() # send sigterm, or ...
    p.kill()      # send sigkill

def main():
    with run_and_terminate_process(args) as running_proc:
        # Your code here, such as running_proc.stdout.readline()

Cela interceptera sigint (interruption du clavier) et sigterm, mais pas sigkill (si vous arrêtez votre script avec -9).

L'autre méthode est un peu plus complexe et utilise le prctl PR_SET_PDEATHSIG de ctypes. Le système enverra un signal à l'enfant une fois que le parent sortira pour une raison quelconque (même sigkill).

import signal
import ctypes
libc = ctypes.CDLL("libc.so.6")
def set_pdeathsig(sig = signal.SIGTERM):
    def callable():
        return libc.prctl(1, sig)
    return callable
p = subprocess.Popen(args, preexec_fn = set_pdeathsig(signal.SIGTERM))

Votre problème est d'utiliser subprocess.check_output - vous avez raison, vous ne pouvez pas obtenir le PID enfant en utilisant cette interface. Utilisez plutôt Popen :

proc = subprocess.Popen(["ls", "-l"], stdout=PIPE, stderr=PIPE)

# Here you can get the PID
global child_pid
child_pid = proc.pid

# Now we can wait for the child to complete
(output, error) = proc.communicate()

if error:
    print "error:", error

print "output:", output

Pour vous assurer de tuer l'enfant à la sortie :

import os
import signal
def kill_child():
    if child_pid is None:
        pass
    else:
        os.kill(child_pid, signal.SIGTERM)

import atexit
atexit.register(kill_child)

Linux
  1. Nouveau processus parent lorsque le processus parent meurt ?

  2. Pourquoi le Pgid des processus enfants n'est-il pas le PID du parent ?

  3. Comment tuer un processus dont le parent est Init ?

  4. Comment Kali gère la prochaine fin de vie de Python 2

  5. Comment tuer le processus zombie

Comment trouver l'ID de processus d'un programme et le tuer [Astuce rapide]

Comment tuer ou terminer un processus Linux :Le guide ultime

Comment tuer tous les processus avec un nom partiel donné ?

Comment obtenir l'ID de processus pour tuer un processus nohup ?

Comment obtenir le PID par nom de processus ?

Comment tuer le script python avec le script bash