Отсоединенный дочерний процесс завершается при выходе из скрипта в node.js

Насколько я могу судить, я следовал инструкциям в документации по API. Я порождаю процесс, используя параметры detached:true, stdio:['ignore','ignore','ignore'], вызываю unref в ChildProcess. У ChildProcess есть pid, поэтому я думаю, что он был успешно запущен. Я пытаюсь запустить сервер йети из задачи ворчания. Этот код находится в асинхронном вызове, поэтому next выполняется и в конечном итоге завершает задачу. Я использую which для полученияcmd, и это правильный путь к сценарию yeti в /usr/local/bin в Mac OSX 10.9. Порт также определяется как пустой порт. Если я запускаю ту же команду в командной строке, она работает нормально. После выхода из ворчания я вызываю ps aux | grep node и ps aux и grep для зарегистрированного pid, но ничего не работает. Вот код:

yeti = spawn("" + cmd + " --server --port " + port, [], {
  detached: true,
  stdio: ['ignore', 'ignore', 'ignore']
});
yeti.unref();
next("Yeti server is running. pid: " + yeti.pid);

person Ryan Lynch    schedule 05.12.2013    source источник


Ответы (2)


Попробуй это:

spawn(cmd, ["--server", "--port", port], {
  detached: true,
  stdio: ['ignore', 'ignore', 'ignore']
});

Я не видел ни одного примера spawn, где все передавалось бы в качестве первого аргумента. Я всегда видел, как он используется, когда первый аргумент представляет собой только имя команды (то есть имя исполняемого файла или путь к исполняемому файлу), а второй аргумент представляет собой массив строк.

Тот факт, что вы видели pid, мало о чем свидетельствует, потому что в системах типа Unix spawn будет fork, а затем exec. fork может быть успешным, поэтому вы видите новый pid, но exec не работает, потому что имя исполняемого файла не имеет смысла для ОС.

person Louis    schedule 05.12.2013
comment
Ха-ха, вот и все! Спасибо. - person Ryan Lynch; 05.12.2013

Если вы обнаружили это, исследуя, почему ваш процесс завершается, когда вы убиваете родителя, хотя он отсоединен, и вы используете PM2: https://github.com/Unitech/pm2/issues/1036

pm2 использует дерево процессов уничтожения. Это убивает все дерево процессов. Выполнение команд cli с --no-treekill решит эту проблему.

также связанные: https://github.com/Unitech/PM2/issues/1564

person kripple    schedule 08.09.2017