16

subprocessPythonでプログラムを起動しています。

場合によっては、プログラムがフリーズすることがあります。これは私の手に負えません。起動元のコマンドラインからできる唯一のことはCtrlEsc、プログラムをすばやく強制終了することです。

これをエミュレートする方法はありますsubprocessか?subprocess.Popen(cmd, shell=True)プログラムの起動に使用しています。

4

6 に答える 6

25

によって返されるオブジェクトには、いくつかのメソッドがあり、それらsubprocess.Popen()は使用できる可能性があります: Popen.terminate()andは、それぞれおよびPopen.kill()を送信します。SIGTERMSIGKILL

例えば...

import subprocess
import time

process = subprocess.Popen(cmd, shell=True)
time.sleep(5)
process.terminate()

...5 秒後にプロセスを終了します。

または、 CTRL-Cをシミュレートするos.kill()など、他の信号を送信するために使用できます...SIGINT

import subprocess
import time
import os
import signal

process = subprocess.Popen(cmd, shell=True)
time.sleep(5)
os.kill(process.pid, signal.SIGINT)
于 2013-05-31T22:00:07.063 に答える
19
p = subprocess.Popen("echo 'foo' && sleep 60 && echo 'bar'", shell=True)
p.kill()

詳細については、モジュールのドキュメントsubprocessをご覧ください: http://docs.python.org/2/library/subprocess.html

于 2013-05-31T21:59:50.023 に答える
0

実行中のサブプロセス呼び出しを強制終了するには、signal.SIGTERM と signal.SIGKILL の 2 つのシグナルを使用できます。例えば

import subprocess
import os
import signal
import time
..
process = subprocess.Popen(..)
..
# killing all processes in the group
os.killpg(process.pid, signal.SIGTERM)
time.sleep(2)
if process.poll() is None:  # Force kill if process is still alive
    time.sleep(3)
    os.killpg(process.pid, signal.SIGKILL)
于 2015-07-24T18:18:26.433 に答える
0

あなたの質問はあまり明確ではありませんが、ゾンビになるプロセスを起動しようとしていると仮定すると、スクリプトのある状態でそれを制御できるようにしたいと考えています。この場合、私はあなたに次のことを提案します:

p = subprocess.Popen([cmd_list], shell=False)

これは、シェルを通過することはあまりお勧めできません。shell=False を使用することをお勧めします。これにより、オーバーフローのリスクが軽減されます。

# Get the process id & try to terminate it gracefuly
pid = p.pid
p.terminate()

# Check if the process has really terminated & force kill if not.
try:
    os.kill(pid, 0)
    p.kill()
    print "Forced kill"
except OSError, e:
    print "Terminated gracefully"
于 2013-05-31T23:18:11.360 に答える