NodeJs在后台执行命令并忘记

时间:2014-08-15 08:51:51

标签: node.js

我有一个无休止的NodeJS script.js循环,我需要这个脚本在后台执行另一个脚本作为服务,实际上是一个WebSocket服务。

var exec = require('child_process').exec;
exec('node bgService.js &');

所以现在两个脚本都运行正常!

当我在Ctrl+C上执行script.js时,bgService.js脚本也会从我不想要的内存中删除。

如何在后台运行并忘记?

2 个答案:

答案 0 :(得分:44)

您可以使用child_process.spawn detached选项:

来执行此操作
var spawn = require('child_process').spawn;
spawn('node', ['bgService.js'], {
    detached: true
});

它将使子进程成为新进程组的领导者,因此在父进程退出后它将继续运行。

但默认情况下,父进程将等待已分离的子进程退出,并且它还将侦听其stdio。要将子进程与父进程完全分离,您应该:

  • 从父进程中分离子进程stdio,将其传输到某个文件或/dev/null
  • 使用unref()方法
  • 从父事件循环引用计数中删除子进程

以下是执行此操作的示例:

var spawn = require('child_process').spawn;
spawn('node', ['bgService.js'], {
    stdio: 'ignore', // piping all stdio to /dev/null
    detached: true
}).unref();

如果你不想丢失孩子的stdin输出,你可以将它传递给某个日志文件:

var fs = require('fs'),
    spawn = require('child_process').spawn,
    out = fs.openSync('./out.log', 'a'),
    err = fs.openSync('./out.log', 'a');

spawn('node', ['bgService.js'], {
    stdio: [ 'ignore', out, err ], // piping stdout and stderr to out.log
    detached: true
}).unref();

有关详细信息,请参阅child_process.spawn documentation

答案 1 :(得分:1)

简答:(tl;dr)

spawn('command', ['arg', ...],
  { stdio: 'ignore', detached: true }).unref()
需要

unref 以防止父母等待。

docs