nodejs - разветвленные процессы уничтожаются, если один из них вызывает exit? - PullRequest
0 голосов
/ 27 июня 2019

Мне нужно обработать / порождать процессы из моего приложения основного узла.Эти процессы должны выполняться «бесконечно», поскольку они проверяют файловую систему на наличие изменений в разных папках и обрабатывают новые файлы.

Я разветвляю процессы следующим образом:

var processes = [];
var fork = require('child_process').fork;

var processList = [
    {'servicename':'faxservice1'}, 
    {'servicename':'faxservice2'},
    {'servicename':'faxservice3'}
];

timeOutValue = 10000;

processList.forEach(Service => {

    var cp = fork(['./modules/services/inbound/fax/service.js']);


    cp.on('close', function() {
        console.log('child process has ended');
        process.exit();
    })

    cp.on('message', (m) => {
        console.log(`SVC | ${m}`);
    });

    setTimeout(function() {
        cp.send('stop');
    }, timeOutValue);    

    // Push spawned process to process-array
    processes.push(cp);

    timeOutValue = timeOutValue + 5000;
});


Дочерние процессы выполняют следующее:

const svcName = 'FAX-INBOUND';

var chokidar = require('chokidar');
var watcher = chokidar.watch('file, dir, or glob', {
    ignored: /[\/\\]\./, persistent: true
  });

var log = console.log.bind(console);

var args = process.argv.slice(2);
console.log(`${svcName} | ${args} | starting`);

process.on('message', (m) => {
    console.log(`${svcName} | ${m} | Service termination command recieved from host`);
    process.exit();
});




watcher
      .on('add', function(path) { log(svcName + " | " + 'File', path, 'has been added'); })
      .on('addDir', function(path) { log(svcName + " | " + 'Directory', path, 'has been added'); })
      .on('change', function(path) { log(svcName + " | " + 'File', path, 'has been changed'); })
      .on('unlink', function(path) { log(svcName + " | " + 'File', path, 'has been removed'); })
      .on('unlinkDir', function(path) { log(svcName + " | " + 'Directory', path, 'has been removed'); })
      .on('error', function(error) { log(svcName + " | " + 'Error happened', error); })
      .on('ready', function() { log(svcName + " | " + 'Initial scan complete. Ready for changes.'); })
      .on('raw', function(event, path, details) { log(svcName + " | " + 'Raw event info:', event, path, details); })

Если я запускаю показанный код, я вижу назапишите, что три процесса были разветвлены:

FAX-INBOUND |  | starting
FAX-INBOUND |  | starting
FAX-INBOUND | Initial scan complete. Ready for changes.
FAX-INBOUND | Initial scan complete. Ready for changes.
FAX-INBOUND |  | starting
FAX-INBOUND | Initial scan complete. Ready for changes.

setTimeout предназначен только для целей отладки и должен отправить сообщение трем разветвленным процессам каждый с задержкой в ​​5 секунд.После того, как порожденные процессы восстановят сообщение, они должны выйти.

НО В консоли я вижу только вывод консоли one разветвленный процесс:

FAX-INBOUND | stop | Service termination command recieved from host

Похоже, что если один разветвленный вызов процесса

process.exit()

все разветвленные процессы будут убиты?

Что я делаю не так?

Привет

1 Ответ

1 голос
/ 27 июня 2019

В "cp.on ('close', ...)" вы выходите из родительского процесса, как только ребенок умер.Это, в свою очередь, уничтожит все разветвленные процессы, так как они не разветвляются с option.detached=true

...