2012-10-23 31 views
8

イベントが発生したときにコードを起動するためにハイパーバイザーにロード/アンロードされるスクリプト(私が働く会社)の作業をしています。実際にスクリプトをアンロードする唯一の方法は、Ctrl - Cです。私は、プロセスを自動化するPythonの関数を書いています。Linuxで作業中にPythonでCtrl-Cキーボード割り込みをシミュレートする

"done"という文字列がプログラムの出力に現れたら、vprobeを殺すはずです。あなたが見ることができるように

lineList = buff.readlines() 
cmd = "vprobe /vprobe/myhello.emt" 
p = subprocess.Popen(args = cmd, shell=True,stdout = buff, universal_newlines = True,preexec_fn=os.setsid) 
while not re.search("done",lineList[-1]): 
     print "waiting" 
os.kill(p.pid,signal.CTRL_C_EVENT) 

が、私は読み取り+書き込みモードでオープンbuffファイル記述子で出力を書いています:私は、コマンドを実行するためにsubprocess.Popenを使用してい 。私は最後の行をチェックする。もしそれが'done'なら、私はそれを殺す。残念ながら、CTRL_C_EVENTはWindowsでのみ有効です。 Linuxで何ができますか?

+3

:定数文字列を 're.search'は良くないlineListに「行って」ながら'のように表すことができます。 [-1]:... ' – nneonneo

+0

うん、あなたは正しい。ありがとう。こんにちはアンドリュー。 –

答えて

8

私はあなたがちょうどそれに相当するLinux signal.SIGINT(割り込み信号)を送ることができると思います。

(編集:私はここで、サブプロセスを制御するためのこの戦略の使用を妨げていましたが、この特定のケースでは制御Cが必要であるとすでに決めているように、 SIGINTそれをする必要があります。)

+0

答えをありがとう。しかし、実際には、SIGINTはサブプロセスの機能だけを殺していますが、vprobeは実行を続けています。あなたはそれをどう殺すのか考えていますか?ありがとう –

+1

それはWindows上で動作する場合、うまくいけば、信号が適切な場所に行くことを意味します。だから、もっと強いものを試してみてください。 SIGTERMに試してください。それがうまくいかない場合は、SIGKLLを試してください。 SIGKILLが機能しない場合は、何もしません。サブプロセスを処理するさまざまな方法をすべて調べなければなりません。 –

+0

'Popen(['vprobe'、 '/vprobe/myhello.emt']、shell = False、...)'を試しましたか? @Core_Dumped – alk

1

多分私は何かを誤解しますが、あなたがそれを行う方法は、望ましい結果を得ることは困難です。

何でもbuffであれば、それを最初にクエリし、それをPopen()のコンテキストで使用し、maciv lineListがそれ自身を満たしてくれることを願っています。あなたはおそらく欲しい

は、これはあなたが行単位を読み出していた出力時に適切に機能することができ、あなたのvprobeスクリプトによって供給管端を与える

logfile = open("mylogfile", "a") 
p = subprocess.Popen(['vprobe', '/vprobe/myhello.emt'], stdout=subprocess.PIPE, buff, universal_newlines=True, preexec_fn=os.setsid) 
for line in p.stdout: 
    logfile.write(line) 
    if re.search("done", line): 
     break 
    print "waiting" 
os.kill(p.pid, signal.CTRL_C_EVENT) 

のようなものです。

+0

これは、私が出力をいくつかのファイルに出力することを目的としていることを除いて、ほぼ正確に私がやりたいことです(チェックのためにPIPEに入ります)。どうやってやるの? (私は文法的にこの時間を訂正したいと思う:)) –

+0

私はそうする方法を提供するための私の答えを編集しました。 – glglgl

+0

上記のコードはうまくいくようですが、オブジェクトpの属性としてstdoutを使用すると、壊れたPIPEエラーが発生します。 –

3

Linuxでは、Ctrl-Cキーボード割り込みは、Popen.send_signal(signal.SIGINT)関数を使用するプロセスにプログラムで送信できます。例えばFYI

import subprocess 
import signal 

.. 
process = subprocess.Popen(..) 
.. 
process.send_signal(signal.SIGINT) 
.. 

コマンドを遮断するためのPopen.communicate()を使用しないでください。..

関連する問題