PM2服务停止触发邮件:cron运行脚本误报所有服务已停止求助
问题原因与解决办法
你的猜测完全正确:PM2的进程是按用户隔离的,root用户执行PM2相关命令时,只能看到root自己启动的PM2进程,看不到ubuntu用户运行的PM2服务。这就导致cron以root身份运行脚本时,获取到的$running数组为空,array_diff后会把所有$required里的服务都判定为异常,从而误报。
解决方法
方法1:用ubuntu用户配置cron
- 切换到ubuntu用户:
su - ubuntu - 编辑该用户的定时任务:
crontab -e - 添加脚本执行命令(务必用绝对路径):
(示例中的*/5 * * * * /usr/bin/php /home/ubuntu/your_monitor_script.php*/5 * * * *代表每5分钟执行一次,可根据需求调整时间规则)
方法2:保留root cron,但指定用户执行PM2命令
如果必须用root用户的cron,需要在脚本里获取PM2进程时,强制以ubuntu用户身份执行命令。假设你之前是通过shell_exec获取PM2进程数据,修改如下:
// 原获取命令(root执行时拿不到ubuntu的进程) // $pm2_output = shell_exec('pm2 list --json'); // 修改后:指定ubuntu用户执行PM2命令 $pm2_output = shell_exec('su - ubuntu -c "pm2 list --json"'); // 后续解析$pm2_output得到$running数组的逻辑不变
额外注意事项
- 脚本中所有文件、命令路径尽量用绝对路径,避免cron环境变量缺失导致找不到资源
- 可以先手动测试命令:用root用户执行
su - ubuntu -c "pm2 list",确认能看到ubuntu用户的PM2进程,再放到脚本里
内容的提问来源于stack exchange,提问作者Ammar
相关产品推荐
相关产品推荐

