node.js forever-monitor不使用linux上的子目录

时间:2013-12-06 16:13:02

标签: node.js forever

我正在尝试运行一个节点脚本,该脚本使用forever-monitor在子目录./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', {它会运行,但我宁愿不对该目录进行硬编码。

我正在使用:   永远监视1.2.3

如何在Linux上使用它?

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

父脚本以/home/ec2-user/test/parentScript.js

运行

它使用forever-monitor调用子脚本/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触发时才会触发 forever-monitor检测到目录更改。
  2. 在Linux和Windows上运行时有一个错误,其中cwd不是要修改被调用脚本的路径,但在Windows#1上没有发生,它总是添加到脚本路径。
  3. 我完全误解了这应该如何运作。
  4. 我认为其中一个选项应该适用于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"
    });
    

1 个答案:

答案 0 :(得分:2)

设置sourceDir选项而不是cwd选项,您应该得到您想要达到的结果。 cwd用于最终调用child_process.spawn,而sourceDir用于查找子脚本所在的位置。请注意,您需要使用__dirnamepath.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,因此在其cwd中找不到host.js。因此,在这种情况下,我们必须将sourceDir定义为host.js的位置/home/user