在Linux中工作时模拟Ctrl-C键盘中断

我正在处理一些脚本(在我工作的公司),这些脚本被加载/卸载到虚拟机pipe理程序中,以便在事件发生时触发一段代码。 实际卸载脚本的唯一方法是按CtrlC。 我正在用Python编写一个自动化过程的函数

只要在程序的输出中看到string"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做什么?

Solutions Collecting From Web of "在Linux中工作时模拟Ctrl-C键盘中断"

我认为你可以只发送相当于Linux的signal.SIGINT (中断信号)。

(编辑:我曾经在这里有一些东西不鼓励使用这种策略来控制子进程,但更仔细的阅读听起来像你已经决定你需要在这种特定情况下控制-C …所以,信号情报应该做到这一点。)

在Linux中,可以使用Popen.send_signal(signal.SIGINT)函数以编程方式将Ctrl-C键盘中断发送到进程。 例如

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

不要使用Popen.communicate()来阻止命令..

也许我误解了一些东西,但是你这样做很难得到理想的效果。

无论什么buff ,你先查询它,然后在Popen 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脚本提供的管道端口,你可以读出linewise,并在发现的输出中适当地采取行动。