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