subprocess
Pythonでプログラムを起動しています。
場合によっては、プログラムがフリーズすることがあります。これは私の手に負えません。起動元のコマンドラインからできる唯一のことはCtrlEsc、プログラムをすばやく強制終了することです。
これをエミュレートする方法はありますsubprocess
か?subprocess.Popen(cmd, shell=True)
プログラムの起動に使用しています。
subprocess
Pythonでプログラムを起動しています。
場合によっては、プログラムがフリーズすることがあります。これは私の手に負えません。起動元のコマンドラインからできる唯一のことはCtrlEsc、プログラムをすばやく強制終了することです。
これをエミュレートする方法はありますsubprocess
か?subprocess.Popen(cmd, shell=True)
プログラムの起動に使用しています。
によって返されるオブジェクトには、いくつかのメソッドがあり、それらsubprocess.Popen()
は使用できる可能性があります: Popen.terminate()
andは、それぞれおよびPopen.kill()
を送信します。SIGTERM
SIGKILL
例えば...
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)
p = subprocess.Popen("echo 'foo' && sleep 60 && echo 'bar'", shell=True)
p.kill()
詳細については、モジュールのドキュメントsubprocess
をご覧ください: http://docs.python.org/2/library/subprocess.html
実行中のサブプロセス呼び出しを強制終了するには、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)
あなたの質問はあまり明確ではありませんが、ゾンビになるプロセスを起動しようとしていると仮定すると、スクリプトのある状態でそれを制御できるようにしたいと考えています。この場合、私はあなたに次のことを提案します:
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"