12

親が強制終了されたときに、node.js child_processで生成されたプロセスが強制終了されることを確認することは可能ですか?

スクリプトの例を次に示します

var spawn = require('child_process').spawn;
var log_tail = spawn("tail", ["-f", "/dev/null"]);

setInterval(function() {
  console.log('just chilling');
}, 10000);

プロセスツリーを見ると、次のことがわかります。

$ ps faux
ubuntu    9788  0.0  0.0  73352  1840 ?        S    15:04   0:00  |   \_ sshd: ubuntu@pts/7  
ubuntu    9789  0.0  0.2  25400  6804 pts/7    Ss   15:04   0:00  |       \_ -bash
ubuntu   10149  1.0  0.2 655636  8696 pts/7    Sl+  15:07   0:00  |           \_ node test.js
ubuntu   10151  0.0  0.0   7184   608 pts/7    S+   15:07   0:00  |               \_ tail -f /dev/null

その後、そのスクリプトを停止する必要があり、ctrl-cを実行できません(ssh接続が失われたと言います)

$ kill 10149
$ ps faux
ubuntu   10151  0.0  0.0   7184   608 pts/7    S    15:07   0:00 tail -f /dev/null

テールプロセスがまだ実行中であり、どの親からも切り離されていることがわかります。

スポナーが殺された場合にスポーンされたプロセスを殺すプログラム的な方法はありますか?

スポーンするために渡すことができるオプションはありますか、それとも別の方法を使用する必要がありますか、それともキルシグナルをキャッチする必要がありますか(そしてそれはキル-9で機能しますか)?

4

1 に答える 1

16

あまり労働に優しいわけではありませんが、これは私が使用するテンプレートとして機能します。

var spawn = require("child_process").spawn;
var workers = [];

var killWorkers = function() {
  workers.forEach(function(worker) {
    process.kill(worker);
  });
});

process.on("uncaughtException", killWorkers);
process.on("SIGINT", killWorkers);
process.on("SIGTERM", killWorkers);

var new_worker = spawn("tail", ["-f", "/dev/null"]);
workers.push(new_worker);

私は主に、マスタープロセスが停止したときにクラスター内のワーカーを強制終了するためにこれを使用します。Ed:明らかに、killWorkersクラッシュや割り込みだけでなく、どこからでも電話をかけることができます。

于 2012-08-09T21:20:35.913 に答える