我在端口5100上运行节点服务器。它作为子进程执行shell脚本,然后启动另一个节点服务器。
var execFile = require('child_process').execFile;
execFile("./testscript", args, {cwd: cwd}, function (error, stdout, stderr) {
console.log("error.." + error);
console.log("stdout.." + stdout);
console.log("stderr.." + stderr);
})
在脚本中,我正在运行nohup的节点进程:
nohup node server.js PORT=5200 2>/dev/null 1>/dev/null &
现在,node @ 5200已经有了testcript的parentid,而testcript又是节点@ 5100的parentid。 当我杀死节点@ 5100的PID时,一切都会停止。
我希望在testcript和node @ 5100退出时,node @ 5200仍然运行。
答案 0 :(得分:3)
创建子进程时需要设置detached
选项。这有点像nohup
。请参阅此处的文档:http://nodejs.org/api/child_process.html#child_process_options_detached
这样做是为了让孩子成为新的"过程组的领导者,"因此,当父进程组死亡时,子进程可以继续运行。
编辑:文档说:
使用分离选项启动长时间运行的进程时,除非提供的stdio配置未连接到父进程,否则进程不会在后台继续运行。如果父母的stdio被继承,孩子将保持与控制终端的连接。
所以你必须编写这样的代码:
var child = spawn(cmd, args, {detached: true, stdio: ['ignore', 'ignore', 'ignore']});
child.unref();
或者您可以使用他们的示例将stdout重定向到文件等
答案 1 :(得分:2)
当我从运行一次的文件中生成一个进程时,我的子进程在父文件正常退出时具有完美的行为。 由于我是由Ctrl + c杀死的服务器文件产生进程而引发了问题,因此它在退出时给出了错误代码,因此整个进程组得到了SIGTERM,导致杀死子进程。
为了成功实现产卵,我使用了double spawn,即从我的服务器文件中生成了一个子进程,该进程进一步生成了运行我的其他节点服务器的child_process。所以我能够避免SIGTERM到达孙子并满足我的要求。