NodeJs在后台执行命令并忘记

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

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

所以现在两个脚本都运行好了!

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

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

你可以使用child_process.spawn和detached选项来完成它:

 var spawn = require('child_process').spawn; spawn('node', ['bgService.js'], { detached: true }); 

它将使subprocess成为新进程组的领导者,所以在父进程退出之后它会继续运行。

但是,默认情况下,父进程将等待分离的subprocess退出,并且还会侦听其stdio 。 要从父母完全分离subprocess,您应该:

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

这是一个例子:

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

如果你不想丢失孩子的stdin输出,你可以将它input到一些日志文件中:

 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文档