Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to detach a spawned child process in a Node.js script?

Tags:

Intent: call an external application with specified arguments, and exit script.

The following script does not work as it should:

 #!/usr/bin/node  var cp = require('child_process');  var MANFILE='ALengthyNodeManual.pdf';  cp.spawn('gnome-open', ['\''+MANFILE+'\''], {detached: true}); 

Things tried: exec - does not detach. Many thanks in advance

like image 365
Deer Hunter Avatar asked Oct 13 '12 09:10

Deer Hunter


2 Answers

From node.js documentation:

By default, the parent will wait for the detached child to exit. To prevent the parent from waiting for a given child, use the child.unref() method, and the parent's event loop will not include the child in its reference count.

When using the detached option to start a long-running process, the process will not stay running in the background unless it is provided with a stdio configuration that is not connected to the parent. If the parent's stdio is inherited, the child will remain attached to the controlling terminal.

You need to modify your code something like this:

#!/usr/bin/node var fs = require('fs'); var out = fs.openSync('./out.log', 'a'); var err = fs.openSync('./out.log', 'a');  var cp = require('child_process'); var MANFILE='ALengthyNodeManual.pdf'; var child = cp.spawn('gnome-open', [MANFILE], { detached: true, stdio: [ 'ignore', out, err ] }); child.unref(); 
like image 66
Vadim Baryshev Avatar answered Sep 20 '22 18:09

Vadim Baryshev


My solution to this problem:

app.js

require('./spawn.js')('node worker.js'); 

spawn.js

module.exports = function( command ) {     require('child_process').fork('./spawner.js', [command]);  }; 

spawner.js

require('child_process').exec(     'start cmd.exe @cmd /k "' + process.argv[2] + '"',      function(){} ); process.abort(0); 
like image 28
CarbonDonuts Avatar answered Sep 22 '22 18:09

CarbonDonuts