cron.d 是什么
/etc/cron.d 是按文件粒度存放系统定时任务的标准目录,每个文件独立描述若干任务,格式与 /etc/crontab 相同——在 5 个时间字段和命令之间多一个「以哪个用户运行」的字段。软件包与配置管理工具偏爱用它:增删任务只需增删文件,不必去编辑一个被多方共享的文件,天然避免了并发写入冲突。
基本信息
| 适用平台 | Linux(Vixie/ISC cron、cronie 等实现) |
|---|---|
| 文件格式 | 分 秒 时 日 月 周 用户 命令,共 7 列(比 crontab -e 多一个用户字段) |
| 文件名规则 | 只使用字母、数字、下划线、连字符,不要带点号 |
| 权限要求 | 文件属主 root、权限 0644;组可写或其他用户可写会被拒绝执行 |
| 生效方式 | cron 每分钟扫描该目录,改完文件自动生效,通常不需要重启服务 |
典型使用场景
- 软件包注册后台任务:安装时放入文件、卸载时删除文件,干净可靠
- 配置管理下发:Ansible、Puppet 等按文件管理任务,天然幂等
- 多任务拆分:一个应用一个文件,便于按业务单独启停与审计
- 环境变量管控:在文件顶部统一声明 SHELL 与 PATH,避免依赖默认值
- 审计与排查:ls -l 目录即可看清有哪些系统级任务
创建任务文件
创建任务文件
sudo tee /etc/cron.d/app-clean > /dev/null <<'EOF'
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
10 3 * * * www /opt/app/clean.sh >> /var/log/app/clean.log 2>&1
EOF
sudo chown root:root /etc/cron.d/app-clean
sudo chmod 0644 /etc/cron.d/app-clean检查与验证
检查与验证
ls -l /etc/cron.d/ # 确认属主与权限
grep -r app /etc/cron.d/ | head # 确认任务内容
sudo tail -n 30 /var/log/cron # RHEL 系看执行记录
sudo grep CRON /var/log/syslog | tail # Debian 系看执行记录任务落点对比
| 位置 | 是否带用户字段 | 适用场景 |
|---|---|---|
| /etc/crontab | 是 | 发行版预置的系统任务,不建议手工改 |
| /etc/cron.d/文件 | 是 | 软件包与配置管理下发的系统任务 |
| crontab -e | 否 | 以当前用户身份运行的个人任务 |
| /etc/cron.daily 等 | 否 | 交给 run-parts 执行的脚本目录,按天/周/月粒度 |
cron.d 文件权限或属主不当(如 0666、非 root 属主)会被 cron 拒绝执行并在日志里记错;标准是 root:root 与 0644。文件里指定了执行用户时,运行该命令的权限就来自这个用户,不要用 root 跑业务脚本。
文件顶部显式声明 SHELL 与 PATH 是稳妥做法:cron 的运行环境极简,PATH 往往只有 /usr/bin:/bin,脚本里调用的自定义命令会报 command not found。文件名不要带点号,这是从 run-parts 命名规则沿袭下来的约定。
排查「任务没执行」的标准顺序:确认文件名合规、确认权限属主为 root:root 且 0644、确认字段是 7 列、确认命令里的程序写成绝对路径与 PATH 里的目录,最后再看系统日志里 cron 对该文件的记录。多数问题都落在前四条上。