GNU/Linux >> Linux の 問題 >  >> Linux

shell=True で起動された Python サブプロセスを終了する方法

プロセス グループを使用して、グループ内のすべてのプロセスにシグナルを送信できるようにします。そのためには、生成された/子プロセスの親プロセスにセッションIDを添付する必要があります。これは、あなたの場合はシェルです。これにより、プロセスのグループリーダーになります。これで、シグナルがプロセス グループ リーダーに送信されると、このグループのすべての子プロセスに送信されます。

コードは次のとおりです:

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() 最終的にシェルプロセスを強制終了し、 cmd まだ実行中です。

これを解決する便利な方法を見つけました:

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

これにより、シェルが強制終了されない子プロセスを起動する代わりに、cmd がシェル プロセスを継承します。 p.pid その場合、cmd プロセスの ID になります。

p.kill() 動作するはずです。

ただし、これがパイプにどのような影響を与えるかはわかりません.


Linux
  1. LinuxでPyenvを使用して複数のPythonバージョンを管理する方法

  2. Kali は今後の Python 2 のサポート終了にどのように対処するか

  3. Linux 上の Python で export を使用する方法

  1. pidを使用してPythonからプロセスを終了するには?

  2. 親プロセスが終了したときに、subprocess.check_output() で作成された python 子プロセスを強制終了する方法は?

  3. bashスクリプトでpythonスクリプトを強制終了する方法

  1. Linuxpmapコマンドでプロセスのメモリ使用量を確認する方法

  2. Bashのプロセス置換をヒアドキュメントと組み合わせる方法は?

  3. Minicondaを使用してPythonアプリケーションをDocker化する方法