永远+ Nodemon同时运行

53

有没有办法让这两个软件包同时运行?

基本上,我想要两全其美。自动运行服务器(并在出现错误时重新启动),同时在.js文件发生更改时进行自动更新。

9个回答

64

你应该运行类似于以下的命令

forever start -c nodemon app.coffee

7
你应该查看cfogelberg在这个问题上的答案,因为它揭示了这个解决方案的一个缺点。我的回答也提供了一个解决方法。 - Jubair
无法处理大量用户访问,请访问https://dev59.com/HYnda4cB1Zd3GeqPAIWS - Irtiza shahid
@Irtizashahid,如果您的应用程序有大量用户,则无法正常工作。您的措辞仅会让人感到困惑,因为上述解决方案仅适用于“正常”情况。 - Patrik Fuhrmann

54

Toxa 步入了正确的轨道,cfogelberg 提出的问题是合理的,但为了避免这个问题您可以执行以下操作:

forever -c "nodemon --exitcrash" app.js

这样做可以确保nodemon实际退出(而不是给出“应用程序崩溃”的消息),然后forever再次接管。

forever --help中,-c指定要运行的命令,否则它默认使用node。没有-c会导致评论中提到的错误。


1
我无法让它工作,Cannot start forever. script /current_working_directory/nodemon does not exist. 有什么办法可以修复这个问题吗?我已经通过npm在本地和全局安装了nodemon。 - Adonis K. Kakoulidis
我也无法使它工作,出现了一个错误,指出脚本“nodemon”不存在。很明显,它试图通过“forever start nodemon”来启动,但我无法弄清如何通过nodemon来启动app.js。我想我只能接受每次文件更改都重新启动的方式,但这似乎效率低下。 - AJB
1
在这种情况下,可能是因为nodemon的路径没有被自动检测到。请尝试使用以下命令:forever start /usr/bin/nodemon --exitcrash app.js - Jubair
13
我еү…йҰ»еЉ еә•еЏ·жқӨж ‡и®°nodemon --exitcrashдҢњдёғforeverзљ„еҚ•дёҒеЏ‚ж•°пәЊд»ӨдңүдҢүз”Ёд»Өдё‹е‘Ң令еђҮеЉЁпәљforever start -c "nodemon --exitcrash" index.jsгЂ‚ - Masadow

15

nodemon FAQ中有相关内容:

如果您在生产环境中使用forever,可以将nodemon与其结合使用。这样,如果脚本崩溃,forever会重新启动脚本,如果有文件更改,nodemon会重新启动脚本。更多详情请参见30号问题

要实现此目的,您需要在调用forever时添加以下参数:

  • 使用forever的-c nodemon选项,告诉forever运行nodemon而不是node
  • 包括nodemon的--exitcrash标志,以确保nodemon在脚本崩溃(或意外退出)时退出。
  • 告诉forever在请求nodemon停止时使用SIGTERM而不是SIGKILL。这确保nodemon可以干净地停止监视的node进程。
  • 可选地添加--uid参数,为您的进程添加唯一名称。在此示例中,uid设置为foo

bash forever start --uid foo --killSignal=SIGTERM -c nodemon --exitcrash server.js

要测试此内容,您可以杀死server.js进程,forever会重新启动它。如果您执行 touch server.js ,nodemon将重新启动它。

要停止由forever和nodemon监视的进程,只需调用以下命令,使用我们分配的uidfoo):

bash forever stop foo

这将停止nodemon和它正在监视的node进程。

请注意,我不建议在生产环境中使用nodemon,因为我不希望它在没有我的显式指令下重新启动。


10

我还没有找到同时运行这两个软件包的方法。我尝试过@toxa的技巧,但当我的node.js应用程序抛出异常时,nodemon不会自动重新启动它,而是将错误消息输出到forever日志:

nodemon] app crashed - waiting for file changes before starting...

然而,Forever 有一个 -w 选项,以下命令与同时运行 nodemon 和 Forever 的效果相同:

forever start -w my-app.js

forever -w相较于nodemon的缺点是: forever没有--delay选项,所以每次更改文件时,我的服务器都会重新启动一次。


5
我更喜欢结合Toxa和Jubair的建议。
forever start -c nodemon app.coffee --exitcrash

我不知道为什么,但这是唯一对我起作用的命令。我是新手,正在使用express,并且默认服务器现在位于bin/www。因此,运行forever start -c nodemon bin/www --exitcrash终于让它工作了。谢谢! - Jens Bodal
@akevit 这是因为这是您的服务器设置方式。这是可定制的。您可以将其设置为以最适合您的方式运行服务器。 - bcbrian

2

如果您需要传递参数:

forever start -c "nodemon --harmony" app.js --exitcrash

1
我是一名有用的助手,可以进行文本翻译。

我正在使用forever-service。. . .

这是对我有效的方法。它会做以下事情:每当应用程序dist/assets文件夹中的json或raml文件被修改时,等待10秒,然后重新启动节点应用程序(server.js脚本):

$ forever-service install raml --script server.js -f " -c nodemon" -o " --delay 10 --watch dist/assets -e json,raml --exitcrash" -e "PATH=/usr/local/bin:$PATH"

然后我可以运行:
$ service raml start|stop|restart|status

我还可以使用chkconfig实用工具使服务在服务器重启时自动启动:

$ chkconfig --add raml
$ chkconfig raml on

1
要监视.js文件的更改,您不需要-e json,raml :). 您根本不需要-e选项。nodemon默认会监视.js文件。 - Julia Anne Jacobs

0

在 package.json 中使用单引号,将 nodemon --existcrash 作为单个参数。

"start": "forever -c 'nodemon --exitcrash' server.js"

输出:

app_1 | [nodemon] 应用程序已崩溃 app_1 | 错误:Forever 检测到脚本退出代码为:1 app_1 | 错误:脚本重启尝试 #1 app_1 | [nodemon] 1.19.4 app_1 | [nodemon] 可以随时重新启动,请输入rs app_1 | [nodemon] 正在监视目录:*.* app_1 | [nodemon] 正在监视扩展名:js、mjs、json app_1 | [nodemon] 启动node /app/server.js` app_1 | 应用正在端口 3000 上运行

`


0
使用方法如下:"start": "firever -c \"nodemon --exitcrash\" <main>.js"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接