2013-02-21 4 views
7

次のコードでchild_process.spawn上の子プロセス()きれいにする方法:出た子プロセスを待たずにNode.jsの

#!/usr/bin/env node 
"use strict"; 

var child_process = require('child_process'); 

var x = child_process.spawn('sleep', [100],); 

throw new Error("failure"); 

が子プロセスを生成して終了します。

どうすればよろしいですか?私はwaitpid(2)を呼びたいのですが、child_processにはwaitpid(2)がないようです。

を追加しました:

申し訳ありませんが、私が本当に欲しいものは親が存在する場合、子プロセスを殺すのではなく、それを待つことです。

+0

あなたはERRをスローする場合エラーがキャッチされない場合、アプリケーションは終了します。子プロセスを待ってからアプリケーションを終了したいのですか? – pfried

+1

実際、親プロセスが終了すると、子プロセスを強制終了したいと思います。 –

答えて

13
#!/usr/bin/env node 
"use strict"; 

var child_process = require('child_process'); 

var x = child_process.spawn('sleep', [10]); 

x.on('exit', function() { 
    throw (new Error("failure")); 
}); 

EDIT:あなたがメインprocess

process.on('exit', function() { x.kill() })のようにリスナーを追加する。しかし、このようなエラーをスローすることによって、メインプロセスのために聞くことができます

が問題である、あなたはより良いプロセスを閉じますprocess.exit()

#!/usr/bin/env node 
"use strict"; 

var child_process = require('child_process'); 

var x = child_process.spawn('sleep', [100]); 

process.on('exit', function() { 
    x.kill(); 
}); 

process.exit(1); 
+0

process.on( 'exit')とprocess.on( 'uncaughtException')は私が望むことをすることができます。ありがとう! –

+3

問題が解決された場合は、回答を受け入れたものとしてマークしてください。 – pfried

+0

あなたが実際に子プロセスを殺すのを待つ必要があります。そうしないと、子プロセスはゾンビプロセスに変わります。親プロセスが終了すると、pid 1(init)はそれをクリーンアップするジョブを取得します。それは機能しますが、技術的には、親が終了する前に自分自身の混乱をきれいにするならば、その方が優れています。 –

3
#!/usr/bin/env node 
"use strict"; 

var child_process = require('child_process'); 

var x = child_process.spawn('sleep', [10]); 

process.on('exit', function() { 
    if (x) { 
    x.kill(); 
    } 
}); 
+1

'x.kill()'が呼び出される前に子プロセスが終了し、再割り当てされたPIDを持つプロセスを誤って終了させないようにするには、 'if(x)'をチェックするのが良いでしょうか? – Sukima