我有一个无休止的NodeJS script.js
循环,我需要这个脚本在后台执行另一个脚本作为服务,实际上是一个WebSocket服务。
var exec = require('child_process').exec;
exec('node bgService.js &');
所以现在两个脚本都运行正常!
当我在Ctrl+C
上执行script.js
时,bgService.js
脚本也会从我不想要的内存中删除。
如何在后台运行并忘记?
答案 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
以防止父母等待。