2012-02-23 97 views
0

我有一个python脚本,它等待一些作业并在线程中执行它们(使用subprocess.Popenshell=True)。当我在shell中运行一个脚本并尝试用Ctrl-C来终止它时,它会正常关闭并干净。模拟Ctrl-C到python脚本

问题是我想运行这个脚本作为守护进程,然后使用某种unix信号终止它。 INT信号应该与Ctrl-C相同,但它不能以相同的方式工作。它将运行subproces.popen子进程。

我也尝试在主线程中提升KeyboardInterupt当我收到信号,但也没有关闭脚本并杀死所有子进程。

任何建议如何模仿Ctrl-C?呼叫到subprocess.popen

实施例:

shell_cmd = "bwa aln -t 8 file1.fasta file1.fastq.gz > file1.sam.sai" 
process = subprocess.Popen(shell_cmd, 
          shell=True, 
          stderr=subprocess.PIPE) 
+0

你是如何发送INT信号的? '从shell中kill -s SIGINT pid'? – 2012-02-23 17:08:25

+0

是的,这就是我发送信号的方式。结果与使用Ctrl-C相比有所不同 – Rok 2012-02-23 17:18:07

回答

6

在主处理提高KeyboardInterrupt提高在主处理KeyboardInterrupt。您必须将信号发送到子过程。

你试过Popen.send_signal?或者,更直接地说,Popen.terminate

+0

当我运行popen(comamand,shell = True)时,它首先启动shell进程并且它是运行命令的子进程。当我做.terminate()子进程继续运行。 – Rok 2012-02-23 16:59:40

+0

@Rok,是否有必要使用'shell = True'?无论哪种方式,请发布您正在使用的“Popen”电话。 – senderle 2012-02-23 17:09:44

+0

使用shell = True会很有好处,因为我不想在脚本中处理标准输出。 – Rok 2012-02-23 17:19:58

0

。使用os.killpg()或使用kill的否定进程ID将SIGINT发送到进程组。