You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置被其他规则覆盖。

解决与验证步骤

  1. 检查当前Cron配置:

    crontab -l
    

    确认分钟字段确实是*/50而非*/10。

  2. 实现严格的每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),需根据实际需求选择。

  3. 排查脚本自身逻辑:
    手动执行脚本,确认脚本内部没有自动重启、重复触发的逻辑,避免脚本自身导致的频繁执行。


内容的提问来源于stack exchange,提问作者Abhinav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:15:54