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

时间:2014-12-24 06:13:11

标签: node.js bash shell child-process

我在端口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仍然运行。

2 个答案:

答案 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到达孙子并满足我的要求。