2016-12-18 10 views
5

TL; DR: Как развернуть процесс, который находится за пределами текущего текущего процесса?Как развернуть процесс другого модуля

Я пытаюсь использовать child_process из Nodejs, чтобы запустить другой процесс nodejs на выходе процесса родителя.

я успешно выполнил процесс с exec, но мне нужен дочерний процесс не зависит от родителей, так что родители могут выйти без ожидания ребенка, поэтому я попытался с помощью spawn с опцией detached: true, stdio: 'ignore' и unref() этот процеса:

параметр options.detached to true позволяет дочернему процессу продолжать работу после выхода родительского элемента.

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

Это дает: ошибка

node MY_PATH ENOENT. к сожалению, я не смог решить проблему.

После того, как возникли проблемы достижения этой цели с spawn и снова чтение documentation я полагал, должен фактически использовать fork:

The child_process.fork() метод является частным случаем child_process.spawn() используется специально для создайте новые процессы Node.js.

fork() не принимает команду в качестве своего первого аргумента, а modulePath, который я не могу показаться, чтобы соответствовать, так как сценарий я пытаюсь запустить как дочерний процесс ISNT в каталоге текущего запущенного процесса , но в зависимости от его.

Назад к стартовой TL; DR - как развернуть процесс, который находится за пределами текущего текущего процесса?

Любая помощь была бы высоко оценена!

EDIT:

Обеспечение решения ошибки spawn ENOENT может быть очень полезно тоже!

+0

http://stackoverflow.com/questions/19902828/why-does-enoent-mean-no-such-file-or-directory –

+0

ли 'MY_PATH' переменную? если это так, вы должны попробовать: '' node '+ MY_PATH' (или использовать строку шаблона) – GilZ

+0

@GilZ нет, на самом деле это относительная строка для '../../ node_modules/bla/bla/bla.js' –

ответ

1

Следующий код должен позволять вам делать то, что вам нужно.

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); 
+0

Hey Molda, используя exec, у меня уже был успех, но мне нужно, чтобы цены продолжали работать после того, как родитель умирает, чтобы иметь независимого ребенка. Я полагал, что мне нужно спать или fork –

+0

Я обновил код с помощью Spawn, который работает нормально. – Molda

+0

Molda спасибо, что на самом деле сработало. Кажется, я не понимаю, почему мне пришлось поместить путь в массив аргументов и почему он не будет работать внутри этой команды. Более того, как он мог работать с 'fork', из документации, которая кажется« fork », предназначена специально для дочерних процессов узла (они называли это« особым случаем 'spawn'), дополнительное объяснение было бы очень оценено! –