Gunakan grup proses untuk mengaktifkan pengiriman sinyal ke semua proses dalam grup. Untuk itu, Anda harus melampirkan id sesi ke proses induk dari proses spawned/child, yang merupakan shell dalam kasus Anda. Ini akan menjadikannya pemimpin kelompok dari proses. Jadi sekarang, saat sinyal dikirim ke pemimpin grup proses, sinyal tersebut dikirim ke semua proses turunan dari grup ini.
Berikut kodenya:
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()
akhirnya membunuh proses shell dan cmd
masih berjalan.
Saya menemukan perbaikan yang nyaman dengan:
p = subprocess.Popen("exec " + cmd, stdout=subprocess.PIPE, shell=True)
Ini akan menyebabkan cmd mewarisi proses shell, alih-alih membuat shell meluncurkan proses anak, yang tidak terbunuh. p.pid
akan menjadi id dari proses cmd Anda.
p.kill()
harus bekerja.
Saya tidak tahu apa efeknya pada pipa Anda.