2012-02-23 139 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發送到進程組。