Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
570 views
in Technique[技术] by (71.8m points)

node.js - NodeJs execute command in background and forget

I have an endless NodeJS script.js loop and I need this script to execute another script in background as a service which is a WebSocket service actually.

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

So now both scripts are running okay!

When I do a Ctrl+C on my script.js, the bgService.js script is also removed from memory which I don't want to.

How to run something in the background and forget ?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can do it using child_process.spawn with detached option:

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

It will make child process the leader of a new process group, so it'll continue running after parent process will exit.

But by default parent process will wait for the detached child to exit, and it'll also listen for its stdio. To completely detach child process from the parent you should:

  • detach child's stdio from the parent process, piping it to some file or to /dev/null
  • remove child process from the parent event loop reference count using unref() method

Here is an example of doing it:

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

If you don't want to loose child's stdin output, you may pipe it to some log file:

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();

For more information see child_process.spawn documentation


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...