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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:45:53