运行节点作为从subprocess运行的脚本的后台进程

我正在端口5100上运行一个节点服务器。它执行一个shell脚本作为subprocess,然后启动另一个节点服务器。

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拥有了对@ 5100节点的testing脚本的支持。 当我杀死节点@ 5100的PID时,一切都停止。

我希望node @ 5200在testscript和node @ 5100退出时仍然运行。

创buildsubprocess时,需要设置detached选项。 这有点像nohup 。 请参阅这里的文档: http : //nodejs.org/api/child_process.html#child_process_options_detached

这样做是为了让孩子成为一个新的“过程组”的领导者,所以当父过程组死亡时,孩子可以继续运行。

编辑:文档说:

使用分离选项启动长时间运行的进程时,除非提供了未连接到父级的stdioconfiguration,否则该进程将不会保持在后台运行。 如果父母的stdio被inheritance,那么孩子将继续与控制terminal连接。

所以你必须这样写代码:

 var child = spawn(cmd, args, {detached: true, stdio: ['ignore', 'ignore', 'ignore']}); child.unref(); 

或者你可以使用他们的例子把stdoutredirect到一个文件等等

当我从一个运行一次的文件中产生一个进程时,我的subprocess有正常退出的父文件的完美行为。 问题是由于我正在产生一个由Ctrl + C杀死的服务器文件产生的进程,所以它给出了一个错误代码退出,结果整个进程组得到了SIGTERM,导致subprocess的杀害。

要成功实现产卵,我使用了双重产卵,也就是从我的服务器文件衍生出一个subprocess,进一步产生了运行我的其他节点服务器的child_process。 所以我能够避免SIGTERM达到孙子和满足我的要求。