GNU/Linux >> Belajar Linux >  >> Linux

Cara menghentikan subproses python yang diluncurkan dengan Shell=True

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.


Linux
  1. Cara Memeriksa Penggunaan Memori Proses dengan Perintah pmap Linux

  2. Cara Mengelola Beberapa Versi Python Dengan Pyenv Di Linux

  3. Bagaimana Menggabungkan Substitusi Proses Bash Dengan Dokumen Here?

  1. Cara Dockerize Aplikasi Python Dengan Miniconda

  2. Cara menggunakan perintah `subproses` dengan pipa

  3. Cara membunuh skrip python dengan skrip bash

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

  2. Cara menggunakan ekspor dengan Python di Linux

  3. Bagaimana cara menghentikan proses dari Python menggunakan pid?