2012-02-23 17 views
0

私はいくつかのジョブを待って(subprocess.Popenshell=Trueを使って)スレッドで実行するPythonスクリプトを持っています。私がシェルでスクリプトを実行し、それをCtrl-Cで終了しようとすると、それは正常にそしてきれいに閉じます。Ctrl + CをPythonスクリプトにシミュレート

問題は、このスクリプトをデーモンとして実行し、ある種のUNIXシグナルを使用して終了することです。 INTシグナルはCtrl-Cと同じにする必要がありますが、同じ方法では機能しません。子プロセスはsubproces.popenのままです。

シグナルを受信したときにメインスレッドでKeyboardInteruptを起こうとしましたが、スクリプトを閉じてすべての子プロセスを終了することもできませんでした。

アドバイスどのようにエミュレートするのですかCtrl-Csubprocess.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信号をどのように送信しましたか? 'kill -s SIGINT pid'はシェルからですか? –

+0

はい、それが信号を送信した方法です。結果はCtrl-Cを使用した場合とは異なりました – Rok

答えて

6

メインプロセスでKeyboardInterruptを上げるには、メインプロセスでKeyboardInterruptを発生させます。シグナルをサブプロセスに送信する必要があります。

Popen.send_signalを試しましたか?

さらに、直接的には、Popen.terminate

+0

popen(comamand、shell = True)を実行すると、最初にシェルプロセスが起動し、コマンドを実行している子プロセスになります。 .terminate()を実行すると、子プロセスは実行を継続します。 – Rok

+0

@Rok、 'shell = True'を使う必要がありますか?いずれにせよ、あなたが使用している 'Popen'コールを投稿してください。 – senderle

+0

スクリプト内で標準出力を扱いたくないので、shell = Trueを使うと便利です。 – Rok

0

。プロセスグループにSIGINTを送るには、os.killpg()またはkillの負のプロセスIDを使用してください。

関連する問題