Ubuntu系统中cron月度任务失效但日/周任务正常的排查求助
Ubuntu月度Cron任务未执行排查与解决
问题概述
在Ubuntu系统维护第三方构建系统时,/etc/cron.d/ansible-cron文件中配置的每月1日07:00触发的bash脚本任务未执行,日志也未生成。手动执行脚本一切正常,且同文件内的日/周任务可正常运行,调用链为:cron配置→bash脚本→Ansible playbook。
上下文
Cron配置行
00 07 1 * * myuser /home/myuser/var/myfolder/ansible-am/collect_sale_statistics.sh >/home/myuser/var/log/collect_sale_statistics-$(date +\%Y-%m).log 2>&1
Bash脚本权限
-rwxr-xr-x 1 myuser myuser 493 Mar 23 17:42 collect_sale_statistics.sh*
Bash脚本内容
#!/bin/bash cd /home/myuser/var/myfolder/ansible-am /home/myuser/var/myfolder/ansible-venv/bin/ansible-playbook playbooks/collect_sale_statistics/main.yml
已做初步分析
- 日志未生成,推测任务在cron执行阶段已失败,与Ansible playbook无关,手动执行脚本正常。
- 已验证
00 07 1 * *的cron时间语法正确,对应每月1日07:00。 - 排除月度任务放在/etc/cron.d/目录的问题,同文件内周任务可正常运行。
排查与解决步骤
1. 调整日志重定向逻辑到脚本内部
cron默认使用/bin/sh执行命令,对$(date +\%Y-%m)的解析可能与bash存在差异,导致日志文件无法创建。将日志生成逻辑移到bash脚本内:
修改Cron配置行
00 07 1 * * myuser /home/myuser/var/myfolder/ansible-am/collect_sale_statistics.sh
更新Bash脚本内容
#!/bin/bash # 定义日志文件路径,由bash处理date命令 LOG_FILE="/home/myuser/var/log/collect_sale_statistics-$(date +%Y-%m).log" # 将所有输出重定向到日志文件 exec > "$LOG_FILE" 2>&1 # 确保目录切换失败时退出脚本并记录错误 cd /home/myuser/var/myfolder/ansible-am || { echo "切换目录失败" && exit 1; } /home/myuser/var/myfolder/ansible-venv/bin/ansible-playbook playbooks/collect_sale_statistics/main.yml
2. 检查cron服务执行日志
查看cron的系统日志,定位具体错误:
- 使用syslog查看:
grep cron /var/log/syslog | grep collect_sale_statistics - 或使用journalctl(Ubuntu 16.04+):
journalctl -u cron.service | grep collect_sale_statistics
日志中会显示任务是否被触发、是否有权限问题或路径错误。
3. 验证/etc/cron.d/文件的权限
cron会忽略权限不符合要求的cron.d文件,确保文件权限为644且属主为root:
sudo chmod 644 /etc/cron.d/ansible-cron sudo chown root:root /etc/cron.d/ansible-cron
4. 临时测试任务触发
将cron时间临时改为每分钟执行一次,验证任务是否能正常运行:
*/1 * * * * myuser /home/myuser/var/myfolder/ansible-am/collect_sale_statistics.sh
测试完成后改回原时间配置。
5. 检查用户环境变量问题
cron执行时的环境变量远少于用户登录环境,若脚本依赖特定环境变量,可在脚本开头导入用户环境:
source /home/myuser/.bashrc
(仅在确实需要时添加,避免引入不必要的环境干扰)
内容的提问来源于stack exchange,提问作者Tms91
相关产品推荐
相关产品推荐

