2013-10-09 5 views
3

В настоящее время я использую веб-службу NodeJs для запуска некоторых сценариев casper.js по запросу. Поскольку casper.js использует stdout, поскольку он является каналом связи к узлу, а узел запускает casper в качестве дочернего процесса, я не могу запускать узел в качестве службы Windows, используя nssm, как и для других наших сервисов узла, поэтому он запускается при запуске сервера как запланированная задача.Начать независимый процесс от NodeJs

Это работает, но теперь мне нужно произвести этот код и действительно нужно сделать его более устойчивым к сбою - то есть мне нужно перезапустить службу, если она не удалась.

Мои варианты, насколько я могу видеть их являются ....

  1. Запуск службы узла на коробке Linux, а затем стандартный вывод должен работать, когда он работает как демон
  2. Каким-то образом сделать окна служба в состоянии «видеть» стандартный вывод
  3. Создание отдельного сервера узла (работает под NSSM), который может отслеживать службы и перезапустить его, если он не

до сих пор, я хотел бы избежать опционов один, если possi благодаря дополнительным хостинговым хостам. Я не могу найти что-нибудь, что поможет с вариантом второй, похоже, что службы Windows просто не работают.

Итак, сегодня я попытался создать службу мониторинга, которая могла бы перезапустить аварийную службу, если она не реагировала на биение. Проблема в том, что я не могу понять, как запустить полностью независимый сервер узлов из другого узла экземпляра. Если бы я должен был использовать дочерний процесс, тогда он по-прежнему является дочерним процессом службы и стандартным доктором.

Итак, возможно ли создать независимый процесс в узле? Есть ли другие предложения по решению этой проблемы?

ответ

3

Дочерний процесс по-прежнему является независимым процессом, но по умолчанию потоки stdin по-прежнему привязаны к родительскому объекту, поэтому, когда родительский процесс умирает, дочерний процесс также выполняет. Чтобы этого избежать, выполните дочерний процесс как отсоединенный. Вот пример из документации:

var fs = require('fs'); 
var spawn = require('child_process').spawn; 
var out = fs.openSync('./out.log', 'a'); 
var err = fs.openSync('./out.log', 'a'); 

var child = spawn('cmd', [], { 
    detached: true, 
    stdio: [ 'ignore', out, err ] 
}); 

child.unref(); 

Метод child.unref() для удаления ссылок на ребенок в цикле обработки событий. Таким образом, родитель не будет ждать выхода ребенка, чтобы выйти из него. Также обратите внимание, что при использовании опции detached вам все равно придется отключить потоки stdin ребенка с родителем или оставаться прикрепленным.

Смежные вопросы