如何自动重启Node服务器?

43
我们正在完成一个项目的开发,客户已经在使用它,但偶尔会出现一些错误-导致服务器崩溃。
我知道我可以在Linux上将服务注册为'upstart'脚本,以便在崩溃时重新启动我的节点服务。
但我们的服务器正在运行其他东西,所以我们不能重新启动它。 好吧,实际上,在写这篇文章的时候,我意识到有两个问题:
  • 'upstart'能否在不重启的情况下工作?某种程度上,我感觉是的 :)
  • 如果不行,当我的节点服务器崩溃时,还有哪些选项可以重新启动?
4个回答

48

是的,upstart 可以在无需重启系统的情况下重新启动您的进程。

此外,您应该了解一下forever


5
Joyent 的错误处理指南不鼓励使用全局错误处理器(Global Error Handler):https://www.joyent.com/developers/node/design/errors。如果出现某些未知的 bug 导致了异常,最好让应用程序崩溃(并重新启动),而不是让应用程序处于糟糕的状态,从而导致更难调试的 bug。 - syonip
1
真的。当我发布这个答案时,我不知道这一点。谢谢你指出来。我会把它删除。 - Daniel

16

PM2是一个用于管理Node.js应用程序的生产进程管理器。


5

如果你关注的是一个始终运行的应用程序的自动重启,我建议使用进程管理器。进程管理器通常处理节点进程(如果集群启用),并负责进程的执行。PM依赖于操作系统: 因为pm位于中间,所以你的node应用程序和操作系统并不是非常紧密地联系在一起。

最后的技巧: 将进程管理器放在upstart上。

这里提供了完整的性能改进路径。


0

由于使用共享服务器且没有 root 权限,我无法下载或安装之前提到的任何库。但我能够使用一个简单的无限 bash 循环来解决我的问题。首先,在基础目录中创建文件 ./startup.sh($ vim startup.sh):

#!/bin/bash
while:
do
    node ./dist/sophisticatedPrimate/server/main.js
done

然后我使用以下命令运行它:

$ bash startup.sh

它工作得很好。这其中有一个不足之处,就是它没有优雅地结束循环(至少在我退出服务器后没有)。我最终做的是通过以下方式找到该进程:

$ ps aux | grep startup.sh

然后用它杀死它

$ kill <process id>
example
$ kill 555555

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