node.js навсегда-монитор не использует дочерний каталог в Linux

Я пытаюсь запустить сценарий узла, который запускает другие сценарии в дочернем каталоге ./host, используя постоянный монитор.

В винде это работает

var child = new (forever.Monitor)('host.js', {
  max: 1,
  silent: false,
  options: [],
  cwd:"./host"
});

В линуксе я получаю

/home/ec2-user/test/node_modules/forever-monitor/node_modules/broadway/node_modules/eventemitter2/lib/eventemitter2.js:283
          throw arguments[1]; // Unhandled 'error' event
                         ^
Error: Target script does not exist: host.js
    at /home/ec2-user/test/node_modules/forever-monitor/lib/forever-monitor/monitor.js:144:26
    at process._tickCallback (node.js:415:13)
    at Function.Module.runMain (module.js:499:11)
    at startup (node.js:119:16)
    at node.js:901:3

Если я изменю первую строку на var child = new (forever.Monitor)('./host/host.js', {, я теперь получу

Error: Cannot find module '/home/ec2-user/test/host/host/host.js'

если я использую child = new (forever.Monitor)('/home/ec2-user/test/host/host.js', {, он запускается, но я бы не хотел жестко кодировать каталог.

Я использую: навсегда-монитор 1.2.3

Как мне заставить это работать на linux?

Редактировать - добавление примеров вышеописанной проблемы с изменением названий директорий и скрипта, возможно /host/host.js вызывает некоторую путаницу. Вместо этого используйте /childDir/script.js.

Родительский скрипт работает как /home/ec2-user/test/parentScript.js

Он вызывает дочерний скрипт /home/ec2-user/test/childDir/script.js с помощью forever-monitor.

Первый пример вверху отлично работает в Windows, но в Linux он игнорирует параметр cwd и выдает Error: Target script does not exist: script.js

Если я добавлю каталог в вызов скрипта (то же самое происходит с использованием sourceDir.)

var child = new (forever.Monitor)('./childDir/script.js', {

cwd теперь добавляется к вызову, из-за чего он пропускает каталог, в котором находится скрипт, и не находит скрипт.

Error: Cannot find module '/home/ec2-user/test/childDir/childDir/script.js'

Так что возможности я вижу.

  1. При работе в Linux существует ошибка, из-за которой cwd срабатывает только в том случае, если forever-monitor обнаруживает изменение каталога.
  2. Существует ошибка при работе как в Linux, так и в Windows, где cwd не предназначен для изменения пути к вызываемому скрипту, но в Windows # 1 этого не происходит, и он всегда добавляется к пути скрипта.
  3. Я совершенно неправильно понимаю, как это должно работать.

Я предполагаю, что один из этих вариантов должен работать как в Windows, так и в Linux. Каков правильный способ сделать это?

var child = new (forever.Monitor)('script.js', {
  max: 1,
  silent: false,
  options: [],
  cwd:"./childDir"
});

или (при условии, что cwd не должен изменять исходный каталог скрипта)

var child = new (forever.Monitor)('script.js', {
  max: 1,
  silent: false,
  options: [],
  sourceDir:"./childDir",
  cwd:"./childDir"
});

person Diver    schedule 06.12.2013    source источник


Ответы (1)


Установите параметр sourceDir вместо параметра cwd, и вы должны получить результаты, которых пытаетесь достичь. cwd используется для возможного вызова child_process.spawn, а sourceDir используется для поиска местоположения дочернего скрипта. Имейте в виду, что вы захотите использовать комбинацию __dirname и path.resolve() для нормализации пути.

Редактировать:

Вы запускаете свой скрипт так:

/home/user$ node startup.js

Что устанавливает cwd для процесса узла, выполняющего startup.js, как /home/user. Итак, если вы запустите приведенную выше команду с host.js в этом каталоге с файлом startup.js, который выглядит следующим образом:

// startup.js
var child = new (forever.Monitor)('host.js', { 
  max: 1,
  silent: false,
  options: []
});

у него cwd из /home/user, и поскольку host.js находится в этом каталоге, все хорошо.

Если вы начнете это как

/home/user/some/other/path$ node /home/user/startup.js

Тогда ваш cwd для сценария startup.js — это /home/user/some/other/path, и поэтому вы не можете найти host.js в своем cwd. Итак, в этом случае мы должны определить sourceDir в местоположении host.js как /home/user

person srquinn    schedule 06.12.2013
comment
Я предполагаю, что то, как cwd «работает» в Linux, вероятно, является ошибкой, но ваш ответ решил мою проблему, и мне больше нравится решение __dirname, чем использование cwd. Спасибо. - person Diver; 10.12.2013
comment
Не ошибка, если подумать о том, что она делает. Вы просите forever найти скрипт и запустить его, для этого и предназначен sourceDir. Параметр cwd предназначен для разветвленного дочернего процесса, полученного в результате запуска сценария в sourceDir. Конечно, они могли бы объединить это в один вариант, но тогда инструмент теряет гибкость (то есть ленивая загрузка каталога стартовых сценариев, каждый из которых работает в других областях системы). - person srquinn; 10.12.2013
comment
Да, я хочу, чтобы разветвленный дочерний процесс запускался в другом каталоге. Я не прошу его найти сценарий и запустить его, я прошу его запустить другое приложение в другом каталоге. Вот почему я использовал настройку дочернего рабочего каталога. Проблема в том, что он не работает должным образом на сервере Linux, который я использую. Он отлично работает в окнах. Посмотрите на различные случаи, которые я перечислил выше, и вы поймете, что я имею в виду. Если это не баг, то как заставить его работать? - person Diver; 10.12.2013
comment
Гарантированно это не ошибка. Nodejitsu использует forever в качестве менеджера процессов в своем производственном стеке, и вся их PaaS запускается на компьютерах с Linux. Я постараюсь обновить свой ответ, чтобы объяснить дальше, но ответ на этот вопрос лежит в источнике forever. Я бы посоветовал поковыряться там, чтобы узнать. - person srquinn; 10.12.2013
comment
Ваш обходной путь помогает мне обойти ошибку, но вы неправильно понимаете проблему. Я обновлю вопрос. - person Diver; 10.12.2013
comment
Вы все еще не понимаете, как работает сценарий. Я бы предложил копаться в коде и следовать логической линии. Становится совершенно ясно, когда вы это делаете. И если вы по-прежнему считаете, что это ошибка, вам следует открыть вопрос github.com/ nodejitsu/навсегда-монитор/проблемы - person srquinn; 10.12.2013
comment
О, кроме того, ребята из nodejitsu довольно активны в IRC (#nodejitsu), они могли бы дать вам лучшее руководство по настройке и тому, как все работает под прикрытием. - person srquinn; 10.12.2013
comment
давайте продолжим обсуждение в чате - person Diver; 10.12.2013