CentOS 8上PM2每90秒被杀死重启问题求助
解决CentOS 8上PM2每90秒被强制重启的问题
我处理过不少CentOS 8环境下PM2异常重启的案例,结合你描述的情况——空状态下PM2仍会被周期性杀死,大概率是系统内存回收机制(OOM Killer)、systemd配置冲突或者SELinux限制导致的,咱们一步步排查解决:
1. 先确认是不是OOM Killer在搞鬼
90秒的周期很符合内存不足时系统自动清理进程的规律,先查日志验证:
# 查看内核OOM日志 dmesg | grep -i oom # 或者查看systemd-oomd的日志 journalctl -u systemd-oomd.service --since "10 minutes ago"
如果日志里出现pm2相关的killed process记录,说明系统内存不足触发了自动清理。解决办法:
- 给服务器加内存(最直接);
- 调整PM2的内存限制,在PM2配置文件里添加:
然后用module.exports = { apps: [{ name: "your-app", max_memory_restart: "200M" // 根据实际情况设置,避免单个进程占用过多内存 }] };pm2 reload ecosystem.config.js加载配置。
2. 检查并修复PM2的systemd配置文件
PM2通过pm2 startup生成的systemd服务文件可能存在不合理的限制,路径一般是/etc/systemd/system/pm2-root.service(以root用户为例):
- 打开这个文件,找到
[Service]段,检查是否有过低的内存限制:
可以直接设置为不限制:# 如果你看到类似下面的配置,注释掉或者调整为合理值 # MemoryMax=100M # MemoryHigh=80MMemoryMax=infinity MemoryHigh=infinity - 同时调整重启策略,避免不必要的循环重启:
Restart=on-failure RestartSec=5 - 保存后重新加载systemd配置并重启PM2服务:
systemctl daemon-reload systemctl restart pm2-root
3. 排查SELinux限制
CentOS 8默认开启SELinux,可能会阻止PM2的正常运行:
- 先临时关闭SELinux测试:
等待90秒,如果PM2不再被杀死,说明是SELinux的问题。setenforce 0 - 给PM2添加SELinux规则,永久解决:
# 设置PM2二进制文件的SELinux上下文 semanage fcontext -a -t bin_t /usr/local/bin/pm2 # 应用上下文设置 restorecon -v /usr/local/bin/pm2 - 重新开启SELinux:
setenforce 1
4. 切换回cgroup v1(针对旧版PM2)
CentOS 8默认使用cgroup v2,而部分旧版本PM2(比如你试过的v3.5.0)对cgroup v2的支持不完善:
- 编辑
/etc/default/grub文件,在GRUB_CMDLINE_LINUX后添加参数:GRUB_CMDLINE_LINUX="... systemd.unified_cgroup_hierarchy=0" - 重新生成grub配置:
grub2-mkconfig -o /boot/grub2/grub.cfg - 重启系统后测试PM2是否正常。
最后验证
完成上述操作后,重启系统,然后用pm2 status查看状态,等待几分钟后再检查journalctl -u pm2-root.service日志,确认没有再出现pm2 has been killed by signal的提示。
内容的提问来源于stack exchange,提问作者Alex Laz
相关产品推荐
相关产品推荐

