6

TL;DR : How does one fork a process that is located outside of the current running process?

I'm trying to use child_process of Nodejs in order to start another nodejs process on the parent's process exit.

I successfully executed the process with the exec but I need the child process be independent of the parent, so the parent can exit without waiting for the child, hence I tried using spawn with the detached: true, stdio: 'ignore' option and unref()ing the process:

setting options.detached to true makes it possible for the child process to continue running after the parent exits.

spawn('node MY_PATH', [], {detached: true, stdio: 'ignore'}).unref();

This yields the :

node MY_PATH ENOENT error. which unfortunately I've failed resolve.

After having troubles achieving this with spawn and reading the documentationagain i figured i should actually use fork:

The child_process.fork() method is a special case of child_process.spawn() used specifically to spawn new Node.js processes.

fork() doesnt take a command as its' first argument, but a modulePath which i can't seem to fit since the script I'm trying to run as a child process isnt in the directory of the current running process, but in a dependency of his.

Back to the starting TL;DR - how does one fork a process that is located outside of the current running process?

Any help would be much appreciated!

EDIT:

Providing a solution to the spawn ENOENT error could be very helpfull too!

8
  • stackoverflow.com/questions/19902828/… Commented Dec 18, 2016 at 15:37
  • Is MY_PATH a variable? if it is, you should try: 'node ' + MY_PATH (or use template string) Commented Dec 18, 2016 at 15:39
  • @GilZ no, actually its a relative string to ../../node_modules/bla/bla/bla.js Commented Dec 18, 2016 at 15:42
  • Try appending the value of __dirname before your relative path Commented Dec 18, 2016 at 15:44
  • @GilZ Hey Gil, doing as you suggested provides the same error, it says : cannot find module CURRENT_PROCESS_DIRECTORY/node ../../node_modules/bla/bla/bla.js the thing is the fork doesnt work like spawn / exec it recieves a modulePath and not the command, how can i deal with it? Commented Dec 18, 2016 at 15:57

1 Answer 1

1

Following code should allow you to do what you need.

var Path = require('path');
var Spawn = require('child_process').spawn;

var relative_filename = '../../node_modules/bla/bla/bla.js';

Spawn('node', [Path.resolve(__dirname, relative_filename)], {detached: true, stdio: 'ignore'}).unref();

process.exit(0);
Sign up to request clarification or add additional context in comments.

4 Comments

Hey Molda, using exec I have already had success but I need the prices to continue on running after the parent dies, to have an independent child I figured I need spawn or fork
I have updated the code with use of Spawn which works OK.
Molda thank you, that actually worked. I cant seem to understand why I had to place the path in the arguments array and why won't it work within the command. Moreover, How could it work with fork, from the documentation it seems like fork is intended specificaly for node child processes (they called it a 'special case of spawn'), additional explanation would be much appreciated!
I don't know the difference in implementation if exec not spawn. In documentation it states that for exec you can put arguments in the first string but for spawn they need to go into second argument which is array. I do not know much more about it, I just follow documentation.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.