【问题标题】:node.js forever-monitor does not use child directory on linuxnode.js forever-monitor 在 linux 上不使用子目录
【发布时间】:2013-12-06 16:13:02
【问题描述】:

我正在尝试运行一个节点脚本,该脚本使用永远监视器在子目录 ./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. 我完全误解了这应该如何工作。

我认为这些选项之一应该适用于 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"
});

【问题讨论】:

    标签: node.js forever


    【解决方案1】:

    设置sourceDir 选项而不是cwd 选项,您应该会得到想要达到的结果。 cwd 用于最终调用child_process.spawn,而sourceDir 用于查找子脚本所在的位置。请记住,您需要结合使用__dirnamepath.resolve() 来规范化路径。

    编辑:

    你像这样运行你的脚本:

    /home/user$ node startup.js
    

    它将运行startup.js 的节点进程的cwd 设置为/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
    

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

    【讨论】:

    • 我猜 cwd 在 Linux 上“工作”的方式可能是一个错误,但你的回答解决了我的问题,我更喜欢 __dirname 解决方案而不是使用 cwd。谢谢。
    • 当你想到它在做什么时,这不是一个错误。您要求forever 查找脚本并运行,这就是sourceDir 的用途。 cwd 选项用于在sourceDir 中运行脚本产生的分叉子进程。当然,他们可以将其合并为一个选项,但随后该工具失去了灵活性(即延迟加载启动脚本目录,每个启动脚本都可以在系统的其他区域工作)
    • 是的,我希望分叉的子进程在不同的目录中运行。我不是要求它查找脚本并运行它,而是要求它在另一个目录中启动另一个应用程序。这就是我使用子工作目录设置的原因。问题是,它在我使用的 linux 服务器上无法正常工作。它在 Windows 中运行良好。看看我上面列出的不同案例,你就会明白我的意思。如果它不是一个错误,那么你如何让它工作?
    • 保证这不是错误。 Nodejitsu 使用forever 作为其生产堆栈中的进程管理器,并且他们的整个 PaaS 都在 linux 机器上运行。我将尝试更新我的答案以进一步解释,但答案在于forever 的来源。我建议在那里四处寻找学习。
    • 你的解决方法让我克服了这个错误,但你误解了这个问题。我会更新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 2012-03-25
    • 2017-11-11
    • 1970-01-01
    • 2011-12-10
    • 2012-04-17
    • 1970-01-01
    相关资源
    最近更新 更多