【问题标题】:Forever + Nodemon running togetherForever + Nodemon 一起运行
【发布时间】:2013-04-28 10:53:20
【问题描述】:

有没有办法让这两个包一起运行?

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

【问题讨论】:

    标签: node.js forever nodemon


    【解决方案1】:

    在 package.json 中使用时,使用单引号将 nodemon --existcrash 作为单个参数。 "start": "forever -c 'nodemon --exitcrash' server.js"

    输出: app_1 | [nodemon] app crashed app_1 | error: Forever detected script exited with code: 1 app_1 | error: Script restart attempt #1 app_1 | [nodemon] 1.19.4 app_1 | [nodemon] to restart at any time, enterrs app_1 | [nodemon] watching dir(s): *.* app_1 | [nodemon] watching extensions: js,mjs,json app_1 | [nodemon] startingnode /app/server.js` app_1 |应用在 3000 端口上运行

    `

    【讨论】:

      【解决方案2】:

      Toxa 在正确的轨道上,cfogelberg raised 的问题是有效的,但要避免该问题,您可以执行以下操作:

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

      这确保nodemon 实际退出(而不是给您“应用程序崩溃”消息),然后forever 再次选择它。

      forever --help 中,-c 指定要运行的命令,否则默认节点。没有 -c 会导致 cmets 中提到的错误。

      【讨论】:

      • 我无法让它工作,Cannot start forever. script /current_working_directory/nodemon does not exist. 有没有办法解决这个问题?我已经通过 npm 在本地和全局安装了 nodemon。
      • 我也无法让它工作,收到脚本nodemon 不存在的错误。所以很明显它正在尝试forever start nodemon,但我不知道如何让 app.js via nodemon 启动。我想我会忍受每次文件更改都重新启动,但这似乎效率很低。
      • 在这种情况下,可能是 nodemon 的路径没有被自动检测到。尝试:永远启动 /usr/bin/nodemon --exitcrash app.js
      • 我必须用引号将nodemon --exitcrash 标记为永远forever start -c "nodemon --exitcrash" index.js 的单个参数
      【解决方案3】:

      nodemon FAQ中有一条关于它的条目:

      如果你使用 nodemon forever(也许在一个 生产环境),您可以将两者结合在一起。这样如果 脚本崩溃,永远重新启动脚本,如果有文件 更改,nodemon 重新启动您的脚本。详情请见issue 30

      要实现这一点,您需要在调用中添加以下内容 forever:

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

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

      要对此进行测试,您可以终止 server.js 进程并永远 重新启动它。如果你touch server.js nodemon 会重启它。

      要停止由 forever 和 nodemon 监控的进程,只需调用 接下来,使用我们在上面分配的uid (foo):

      bash forever stop foo

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

      请注意,我建议在生产中使用 nodemon 环境 - 但那是因为我不希望它在没有我的情况下重新启动 明确的指示。

      【讨论】:

        【解决方案4】:

        如果需要传递参数:

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

        【讨论】:

          【解决方案5】:

          我正在使用 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
          

          【讨论】:

          • 要监视 .js 更改,您不需要 -e json,raml :)。您根本不需要-e 选项。 nodemon 默认会监视 .js 文件。
          【解决方案6】:

          我更喜欢 Toxa 和 Jubair 建议的组合。

          forever start -c nodemon app.coffee --exitcrash
          

          【讨论】:

          • 我不知道为什么,但这是唯一对我有用的命令。我是新手,使用 express,默认服务器现在位于bin/www。所以运行forever start -c nodemon bin/www --exitcrash 终于可以正常工作了。谢谢!
          • @akevit 那是因为你的服务器就是这样设置的。那是可定制的。您可以将其设置为以最适合您的方式运行服务器。
          【解决方案7】:

          我还没有找到让两个包一起运行的方法。我尝试使用@toxa 的技术,但是当我的 node.js 应用程序抛出异常时,nodemon 不会自动重新启动它,而是将错误消息输出到永久日志:

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

          但是,forever 有一个-w 选项,并且以下命令实际上与我同时运行 nodemon 和永远相同:

          forever start -w my-app.js
          

          forever -wnodemon 的缺点:forever 没有 --delay 选项,因此我的服务器会为每个更改的文件重新启动一次。

          【讨论】:

            【解决方案8】:

            你应该运行这样的东西

            forever start -c nodemon app.coffee
            

            【讨论】:

            • 您应该看到 cfogelberg 对此问题的回答,以了解此解决方案的弱点。我的回答也有解决方法。
            • 不适用于大量用户访问此stackoverflow.com/questions/29536649/…
            • @Irtizashahid,如果您的应用程序有大量用户,它就不起作用。您的措辞令人困惑,因为上述解决方案在“正常”情况下有效。
            猜你喜欢
            • 2019-03-11
            • 1970-01-01
            • 2015-08-04
            • 1970-01-01
            • 2021-03-11
            • 1970-01-01
            • 2019-07-24
            • 2013-12-04
            • 2020-04-03
            相关资源
            最近更新 更多