GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara membunuh proses anak python yang dibuat dengan subprocess.check_output() saat induknya meninggal?

Ya, Anda dapat mencapai ini dengan dua metode. Keduanya mengharuskan Anda untuk menggunakan Popen bukannya check_output . Yang pertama adalah metode yang lebih sederhana, menggunakan try..finally, sebagai berikut:

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()

Ini akan menangkap sigint (interupsi keyboard) dan sigterm, tetapi bukan sigkill (jika Anda mematikan skrip dengan -9).

Metode lainnya sedikit lebih kompleks, dan menggunakan prctl PR_SET_PDEATHSIG ctypes. Sistem akan mengirimkan sinyal ke anak setelah induk keluar karena alasan apa pun (bahkan 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))

Masalah Anda adalah dengan menggunakan subprocess.check_output - Anda benar, Anda tidak bisa mendapatkan PID anak menggunakan antarmuka itu. Gunakan Popen sebagai gantinya:

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

Untuk memastikan Anda membunuh anak saat keluar:

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. Mengapa Proses Pgid Anak Bukan Pid Orang Tua?

  2. Bagaimana Membunuh Proses Yang Induknya Init?

  3. Bagaimana cara membuat proses anak mati setelah orang tua keluar?

  1. Apakah mungkin mengubah Lingkungan dari proses induk dengan Python?

  2. Bagaimana cara mengatur direktori kerja dari proses induk?

  3. Bagaimana cara mendapatkan ID proses untuk mematikan proses nohup?

  1. Bagaimana Kali menangani Akhir Kehidupan Python 2 yang akan datang

  2. Bagaimana cara mendapatkan PID dengan nama proses?

  3. Cara membunuh skrip python dengan skrip bash