NodeJ在后台执行命令并忘记

杰克·M

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

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

因此,现在两个脚本都可以正常运行!

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

如何在后台运行某些东西而忘记?

列昂尼德·贝斯卡斯特尼

您可以使用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文档

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章