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'
所以我看到的可能性是。
- 在linux上运行时,如果forever-monitor检测到目录更改,只会触发cwd。
- 在Linux和Windows上运行时,有一个错误,其中cwd不打算修改被调用的脚本的path,但是在#1窗口没有发生,并且它总是添加到脚本path。
- 我完全错误地理解这应该如何工作。
我假设其中的一个选项应该可以在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.spawn
而sourceDir
用于查找子脚本所在的位置。 请记住,您将要使用__dirname
和path.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/user
的cwd
,因为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