узел.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 ответ:
Не очень удобно для труда, но это служит шаблоном, который я использую:
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
из любого места, а не просто сбоить или прерывать.