nodejs - 如果一个进程调用退出,分叉进程会被杀死吗?
nodejs - forked processes get killed if one process calls exit?
我需要 fork/spawn 从我的主节点应用程序处理。此进程应该 运行 "endless" 因为它们检查文件系统以了解不同文件夹中的更改并处理新文件。
我按以下方式分叉进程:
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 秒的延迟。生成的进程收到消息后,它们应该退出。
BUT 在控制台我只看到 one 分叉进程的控制台输出:
FAX-INBOUND | stop | Service termination command recieved from host
看来,如果 一个 分叉进程调用
process.exit()
所有分叉进程都被杀死了?
我做错了什么?
此致
在 "cp.on('close', ...)" 中,您会在子进程死亡后立即退出父进程。这反过来会杀死所有分叉的进程,因为它们没有用 option.detached=true
分叉
我需要 fork/spawn 从我的主节点应用程序处理。此进程应该 运行 "endless" 因为它们检查文件系统以了解不同文件夹中的更改并处理新文件。
我按以下方式分叉进程:
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 秒的延迟。生成的进程收到消息后,它们应该退出。
BUT 在控制台我只看到 one 分叉进程的控制台输出:
FAX-INBOUND | stop | Service termination command recieved from host
看来,如果 一个 分叉进程调用
process.exit()
所有分叉进程都被杀死了?
我做错了什么?
此致
在 "cp.on('close', ...)" 中,您会在子进程死亡后立即退出父进程。这反过来会杀死所有分叉的进程,因为它们没有用 option.detached=true