2017-01-21 7 views
1

私は、次のようなNodeJSコードを持っている:私は正常にシャットダウンを管理したい防止信号(NodeJS)

[HelloWorld.py] 

print 'Hi there' 
import time 
time.sleep(5) 

、しかし:

よう
[myFile.js] 

var path = require("path"); 
var cp = require("child_process"); 
var child = cp.spawn("python",["HelloWorld.py"], { stdio:'pipe', }); 

child.stdout.on('data', (data) => { 
    console.log(`CHILD stdout: ${data }`); 
}); 

child.stderr.on('data', (data) => { 
    console.log(`CHILD stderr: ${data}`); 
}); 

process.on("SIGINT",()=>{ 
    // close gracefully 
    console.log("Received SIGINT"); 
}) 
child.on('exit',(code)=>{console.log(`child Process exited with code ${code}`)}) 

とPythonスクリプト私はこのコンソールに出力を取得、

> node myFile.js 

とプレス制御-C:私は経由して、コマンドラインでこのコードをスタート

^CReceived SIGINT 
CHILD stdout: Hi there 

CHILD stderr: Traceback (most recent call last): 
    File "HelloWorld.py", line 3, in <module> 
    time.sleep(5) 
KeyboardInterrupt 

child Process exited with code 1 

python(子プロセスで実行中)が '^ C'キーボードイベントを受け取ったことを示します。しかし、私はキーボードの割り込みでクラッシュするのではなく、子プロセスをちょっと優雅に終了させたいと思っています。 (また、子プロセスがクラッシュする原因となった)

は、私が(子プロセスがクラッシュする原因と)(動作しませんでした) [undefined,'pipe','pipe']、および ['ignore','pipe','pipe']含め、 options.stdioのためのさまざまな組み合わせを試してみました、と私は worker.stdin.end()を試してみました。

への道はありませんは親NodeJSプロセスから標準を継承していますか?

+0

は、あなたのPythonスクリプトで例外をキャッチに反対しています?そうでなければ、 'try'' catch'文でラップしてエラーを無音にすることができます。 参照:http://stackoverflow.com/questions/7073268/remove-traceback-in-python-on-ctrl-c – Mike

+0

良い点ですが、私の質問はPythonではなくNodeJSです。上記の例ではPythonを使用しています。(A)KeyboardInteruptが子プロセスに渡されていることを明確にしています。(B)私が書いているコードは一般化されたタスクランナー用です。子プロセスで実行されるすべてのスクリプトと言語でtry/catchを挿入します。最初に子プロセスに割り込みが送信されないようにしてください。 – Jthorpe

答えて

0

RTFM:trueoptions.detachedを設定すると、親が殺されたときのプロセスを強制終了する方法を添付の子である(驚き)、キル信号を伝播防止するものである...