узел.JS порожденный процесс остается, если сценарий убит


Можно ли убедиться,что процессы порождены узлом.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)?

1 11

1 ответ:

Не очень удобно для труда, но это служит шаблоном, который я использую:

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);

Я в основном использую это для убийства рабочих в кластере, когда умирает главный процесс. Эд: очевидно, что вы можете просто позвонить killWorkers из любого места, а не просто сбоить или прерывать.