1

我正在尝试运行一个节点脚本,该脚本使用永远监视器在子目录 ./host 中启动其他脚本。

在 Windows 上这有效

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

在linux上我得到

/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', {它运行,但我宁愿不对目录进行硬编码。

我正在使用:forever-monitor 1.2.3

我如何让它在 linux 上工作?

编辑- 添加上述问题的示例并更改目录和脚本的名称,这可能/host/host.js会引起一些混乱。改为使用/childDir/script.js

父脚本运行为/home/ec2-user/test/parentScript.js

/home/ec2-user/test/childDir/script.js它使用永远监视器调用子脚本。

顶部的第一个示例在 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 仅在永远监视器检测到目录更改时才会触发。
  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"
});
4

1 回答 1

2

设置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: []
});

它有一个cwdof/home/user并且因为host.js在那个目录中,所以一切都很好。

如果你像这样开始

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

那么你cwd的脚本是 /home/user/some/other/path ,因此在它的 cwd 中startup.js找不到。host.js因此,在这种情况下,我们必须将sourceDir到的位置定义host.js/home/user

于 2013-12-06T18:18:07.203 回答