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

我试图运行一个节点脚本,使用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', {它会运行,但我宁愿不用硬编码目录。

我正在使用:forever-monitor 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现在被添加到调用中,使其跳过脚本所在的目录,而不是find脚本。

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

所以我看到的可能性是。

  1. 在linux上运行时,如果forever-monitor检测到目录更改,只会触发cwd。
  2. 在Linux和Windows上运行时,有一个错误,其中cwd不打算修改被调用的脚本的path,但是在#1窗口没有发生,并且它总是添加到脚本path。
  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" }); 

设置sourceDir选项,而不是cwd选项,你应该得到你正在尝试实现的结果。 cwd用于最终调用child_process.spawnsourceDir用于查找子脚本所在的位置。 请记住,您将要使用__dirnamepath.resolve()的组合来标准化path。

编辑:

你运行你的脚本是这样的:

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

它有一个/home/usercwd ,因为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