树莓派上PM2运行的应用一段时间后休眠,无法访问求助
嘿,我来帮你搞定这个事儿——首先得纠正一个误解:PM2默认绝对不会主动休眠你的进程,你遇到的“无法访问”大概率是进程崩溃、资源耗尽,或者树莓派的低功耗设置影响了运行。下面一步步排查解决:
1. 先搞清楚进程到底是死了还是休眠
先跑个命令看看PM2管理的进程状态:
sudo pm2 status
如果进程显示stopped或者errored,那就是崩溃了,不是休眠。这时候直接看日志找问题最靠谱:
# 查看所有进程的实时日志 sudo pm2 logs # 单独查看历史追踪器的日志 sudo pm2 logs historytracker # 单独查看API的日志 sudo pm2 logs app.js
日志里肯定会有崩溃的原因——比如内存爆了、数据库连不上、定时任务抛错之类的。
2. 检查树莓派的低功耗设置
树莓派默认可能会触发系统休眠(尤其是没接屏幕的情况下),这会直接影响进程运行。把系统休眠彻底关掉:
- 编辑
/etc/rc.local文件,在exit 0这一行前面添加:sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target - 重启树莓派生效:
sudo reboot
3. 给PM2加个“自动重启保险”
你已经执行了pm2 startup让PM2随系统启动,但还可以配置进程崩溃后自动重启,防止意外挂掉:
# 设置进程崩溃后3秒自动重启(给系统留缓冲时间) sudo pm2 restart app.js --restart-delay=3000 sudo pm2 restart historytracker --restart-delay=3000 # 保存当前进程列表,确保树莓派重启后PM2自动加载这些应用 sudo pm2 save
另外,树莓派内存有限,可以设置内存阈值,超过就自动重启进程,避免内存泄漏搞崩应用:
# 比如设置进程内存超过200MB就重启 sudo pm2 start app.js --max-memory-restart 200M sudo pm2 start historytracker --max-memory-restart 200M
4. 验证定时任务的稳定性
你提到历史追踪器用了schedule.scheduleJob('0 */6 * * *'),虽然在其他系统正常,但树莓派可能有时区偏差导致任务没触发?给定时任务加个日志验证:
schedule.scheduleJob('0 */6 * * *', () => { console.log(`[${new Date().toISOString()}] 历史追踪器开始执行写入任务`); // 你的数据库写入逻辑 console.log(`[${new Date().toISOString()}] 写入任务完成`); });
然后看PM2日志,确认每6小时是否有这些日志输出。如果没有,大概率是时区问题,启动进程时指定时区就行:
sudo pm2 start historytracker --env TZ="Asia/Shanghai"
(把时区改成你所在的时区,比如Europe/Brussels)
5. 检查资源占用情况
树莓派的CPU和内存都不算强,长时间运行可能因为内存泄漏导致进程崩溃。用这两个命令看资源:
# 实时查看PM2进程的CPU/内存占用 sudo pm2 monit # 查看系统整体资源使用 top
如果某个进程的内存一直在涨,那就是代码有内存泄漏——比如数据库连接没释放、定时器没清理,这时候就得回去查代码了。
最后总结
先从日志和进程状态入手,定位是进程崩溃还是系统问题,再针对性解决。PM2不会主动休眠你的应用,别被这个误解带偏啦~
内容的提问来源于stack exchange,提问作者Achiel Volckaert

