CentOS生产服务器Cron任务执行异常及报错问题求助
一、CRON发送邮件失败报错的解决
原因
Cron默认会将任务的输出(包括标准输出、错误输出)通过sendmail发送给执行任务的用户(此处为root),但你的系统未安装sendmail,或/usr/sbin/sendmail路径不存在,导致触发执行失败报错。
解决方法
1. 若需要邮件通知任务结果
安装sendmail或postfix(CentOS推荐用postfix):
# 安装并启用sendmail yum install sendmail -y systemctl start sendmail systemctl enable sendmail # 或安装并启用postfix yum install postfix -y systemctl start postfix systemctl enable postfix
2. 若不需要邮件通知
将任务输出(含错误输出)重定向到日志文件或/dev/null:
# 输出写入日志(同时捕获标准输出和错误输出) */50 * * * * /usr/bin/php /webuser/production/class/abc.php >> /somerandomfolder/log_cron_check 2>&1 # 或直接丢弃所有输出 */50 * * * * /usr/bin/php /webuser/production/class/abc.php > /dev/null 2>&1
注意:仅写>> 日志只会重定向标准输出,错误输出仍会触发Cron发邮件,必须加2>&1将错误输出一并处理。
二、任务执行间隔变为10分钟的问题排查
核心原因
你对Cron的*/50语法理解有误:*/50 * * * *并非严格的“每50分钟执行一次”,它的逻辑是匹配分钟数为50的倍数的时间点,实际执行序列为:0分 → 50分 → 下一小时40分 → 下一小时30分 → 下一小时20分 → 下一小时10分 → 0分
正常情况下每次间隔都是50分钟,但你数据库记录的12:20、12:30说明实际是每10分钟执行一次,大概率是修改配置时误将*/50改成了*/10,或Cron配置被其他规则覆盖。
解决与验证步骤
检查当前Cron配置:
crontab -l确认分钟字段确实是
*/50而非*/10。实现严格的每50分钟执行:
若需要跨小时的固定50分钟间隔,保留*/50即可,它会按0→50→40→30→20→10→0的序列执行,每次间隔均为50分钟。若需求是每个小时内的固定时间点(如每小时0分、50分),可改用更清晰的写法:
0,50 * * * * /usr/bin/php /webuser/production/class/abc.php >> /somerandomfolder/log_cron_check 2>&1但这种写法会出现10分钟间隔(如12:50到13:00),需根据实际需求选择。
排查脚本自身逻辑:
手动执行脚本,确认脚本内部没有自动重启、重复触发的逻辑,避免脚本自身导致的频繁执行。
内容的提问来源于stack exchange,提问作者Abhinav

