我正在处理一些脚本(在我工作的公司中),这些脚本被加载/卸载到虚拟机管理程序中,以便在事件发生时触发一段代码。实际卸载脚本的唯一方法是按 Ctrl - C 。我正在用Python编写一个自动化过程的函数
一旦在程序的输出中看到字符串"done"
,它就会终止vprobe
。
我正在使用subprocess.Popen
来执行命令:
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
文件描述符中编写输出。我检查最后一行;如果它有'done'
,我会杀了它。不幸的是,CTRL_C_EVENT
仅对Windows有效。
我能为Linux做些什么?
答案 0 :(得分:8)
我认为你可以发送Linux等价物,signal.SIGINT
(中断信号)。
(编辑:我曾经在这里阻止使用这种策略来控制子过程,但是仔细阅读听起来就像你已经决定在这种特殊情况下你需要控制-C ......所以,SIGINT应该这样做。)
答案 1 :(得分:5)
在Linux中,Ctrl-C键盘中断可以使用Popen.send_signal(signal.SIGINT)函数以编程方式发送到进程。例如
import subprocess
import signal
..
process = subprocess.Popen(..)
..
process.send_signal(signal.SIGINT)
..
不要使用Popen.communicate()来阻止命令..
答案 2 :(得分:2)
也许我误解了一些事情,但是你这样做很难得到理想的结果。
无论buff
是什么,您首先查询它,然后在Popen()
的上下文中使用它,然后您希望通过maciv lineList
填充自己。
您可能想要的是
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)
这为您提供了一个由vprobe
脚本提供的管道末端,您可以按行读出并根据找到的输出进行适当的操作。