云VPS上NodeJS进程崩溃后如何实现自动重启?
推荐方案一:使用PM2(轻量易用,Node.js专属)
PM2是Node.js生态里最常用的进程管理工具,自带进程监控、自动重启、日志管理功能,完全能解决你的问题:
- 安装PM2(全局安装):
npm install pm2 -g - 进入你的项目目录,启动Node服务:
这里的pm2 start app.js --name "your-app-name"your-app-name可自定义,方便后续管理进程 - 设置PM2开机自启(防止服务器重启后服务不自动启动):
执行后会生成对应系统启动脚本,按提示完成配置即可pm2 startup - 常用管理命令:
- 查看所有PM2管理的进程状态:
pm2 status - 查看服务日志:
pm2 logs your-app-name - 重启服务:
pm2 restart your-app-name
- 查看所有PM2管理的进程状态:
PM2会自动监控你的Node进程,一旦进程崩溃退出会立即重启,且自身有守护机制,不用担心PM2进程本身挂掉的问题。
推荐方案二:使用systemd(系统级守护,生产环境首选)
如果你的服务器是基于systemd的发行版(比如Ubuntu 16.04+、CentOS 7+),用systemd配置服务是最稳定的方案,属于系统级别的守护,可靠性更高:
- 创建systemd服务配置文件:
sudo nano /etc/systemd/system/your-app.service - 写入以下配置内容(根据实际路径修改):
[Unit] Description=Your Node.js Application After=network.target [Service] User=your-username # 替换成运行服务的系统用户 WorkingDirectory=/path/to/your/project # 替换成你的项目目录 ExecStart=/opt/bitnami/node/bin/node app.js # 替换成你的Node可执行文件路径和启动脚本 Restart=always # 进程退出时总是自动重启 RestartSec=5 # 重启间隔5秒 StandardOutput=append:/path/to/stdout/log # 标准输出日志路径 StandardError=append:/path/to/stderr/log # 错误输出日志路径 [Install] WantedBy=multi-user.target - 保存退出后,重新加载systemd配置:
sudo systemctl daemon-reload - 启动服务并设置开机自启:
sudo systemctl start your-app sudo systemctl enable your-app - 常用管理命令:
- 查看服务状态:
sudo systemctl status your-app - 实时查看日志:
journalctl -u your-app -f - 重启服务:
sudo systemctl restart your-app
- 查看服务状态:
systemd会全程监控服务进程,哪怕服务意外退出,甚至第三方进程管理工具出问题,systemd都能确保服务重启,适合生产环境长期运行。
关于你之前尝试的方案问题分析
- forever失败:forever的守护机制不如PM2完善,大概率是未正确配置开机自启或遇到环境变量问题,PM2是forever的替代方案,功能更全面。
- cron任务失败:可能的原因包括:
lsof未安装,导致无法检测端口占用,可通过sudo apt install lsof(Debian/Ubuntu)或sudo yum install lsof(CentOS)安装- cron的环境变量和用户终端环境不同,导致Node路径无法识别,建议在cron命令里写绝对路径,或在脚本中指定环境变量
- 后台启动方式有问题,且cron每分钟检查的延迟(最多1分钟)本身就不如上面两种方案的实时重启高效
内容的提问来源于stack exchange,提问作者ginjaemocoes
相关产品推荐
相关产品推荐

