2011-07-26 16 views
19

私はchild_process.exec/child_process.spawnを使って新しいプロセスをforkし、child.kill/process.killを使ってkillしました。それは、cat/lsのような単純なバイナリ実行ファイルでうまく動作し、子プロセスはちょうど殺されます。Node.JSで子プロセスがkillされない

しかし、ときスクリプト(たとえばP1)そのフォーク別の子プロセス(例えばP2)に取得するには、唯一のスクリプトインタプリタP1が殺さなく、子プロセスP2。

質問:このような子プロセスP2をNode.JSで取得する方法はありますか?

コードrun_and_kill('firefox')でOK run_and_kill('ls -Al /usr/lib')で正常に動作しますが、ない:

function run_and_kill(cmd) { 
    var exec = require('child_process').exec, 
     ls = exec(cmd); 
    console.log('Child process started: %d', ls.pid); 
    ls.on('exit', function(code, signal) { 
     console.log('exit with code %s and signal %s', code, signal); 
    }); 
    ls.kill(); 
} 
+0

あなたは手動でそれらをkillしようとすることができます(おそらくP2はSIGHUPを無視します)。 - http://stackoverflow.com/questions/392022/best-way-to-kill-all-child-processes –

+0

@AndreySidorov /そのPIDを知っていますか? – Ghostoy

+0

あなたはそれを知っています - 'ls.pid'(https://github.com/joyent/node/blob/master/lib/child_process.js#L250) –

答えて

1

私はあなたのP2はフォークやP1の子ではなく、それによって生成された並列プロセスでもないと思います。 Firefoxの場合(少なくともLinuxでは)、Firefoxアプリケーションはラッパーシェルスクリプトによって起動されます。常にfirefoxになる場合は、インストールフォルダからバイナリを直接実行することをお勧めします。

3

これを達成するために私が見つけた最も安全な方法は、child.pidを引数として使用して信号を消去する生成プロセスを作成することです。フォークで例:

var process; 
process = require('child_process'); 

var fork, child; 
fork = process.fork; 
child = fork('./index'); 

var spawn; 
spawn = process.spawn; 
spawn('kill', [child.pid]); 
console.log('sending SIGTERM to child process (socket server)'); 

私は一般的に開始するために、主にbeforeAll /やっぱブロックで、スペックでこれを使う/サーバを殺す(例では」./index.js')。

+0

*これらの子プロセスも終了している限り、これはうまくいきます:) –

関連する問題