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 ?
Method 1: Using the Ctrl+C key This shortcut can be used to stop any running process by hitting this command on terminal.
The exec() function in Node. js creates a new shell process and executes a command in that shell. The output of the command is kept in a buffer in memory, which you can accept via a callback function passed into exec() .
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:
stdio
from the parent process, piping it to some file or to /dev/null
unref()
methodHere 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With