/etc/crontab
/etc/crontab 是系统级定时任务文件,格式与用户 crontab 只有一个关键差别:时间字段之后多一列「以哪个用户身份执行」,然后才是命令。它由 root 维护,权限通常为 0644、属主 root。系统预置的 cron.hourly 等目录就是通过它配合 run-parts 调度起来的,发行版会把这段默认内容写在这里。
基本信息
| 用途 | 书写系统级定时任务,可指定执行身份 |
|---|---|
| 格式 | 分 时 日 月 周 用户 命令(共七列,比用户 crontab 多一列用户) |
| 相关位置 | /etc/crontab 与 /etc/cron.d/ 下文件使用同一格式 |
| 生效方式 | cron 会定期读取这些文件,通常保存即生效,无需重启服务 |
典型使用场景
- 系统维护任务:以 root 身份执行日志轮转、缓存清理、证书检查
- 以指定用户运行:需要以应用账号而非 root 执行的任务
- 目录级调度:通过 run-parts 触发 cron.hourly 等目录里的脚本
- 集中管理:把多台机器共用的任务模板放到统一位置维护
- 审计留痕:把系统级任务与业务任务分开,职责清晰
文件内容示例
文件内容示例
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 每小时的第 17 分钟以 root 运行 hourly 目录下的脚本
17 * * * * root cd / && run-parts --report /etc/cron.hourly
# 每天 06:25 运行每日任务(装了 anacron 时交给 anacron)
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
# 每天凌晨以应用账号执行清理
30 3 * * * appuser /opt/app/bin/cleanup.sh >> /var/log/app/cleanup.log 2>&1修改流程
修改流程
sudo cp -a /etc/crontab /etc/crontab.bak-$(date +%F) # 备份
sudo vim /etc/crontab # 第 6 列写用户名
sudo diff -u /etc/crontab.bak-$(date +%F) /etc/crontab # 核对改动
systemctl status crond --no-pager | head -n 5 # 看服务状态(Debian 系服务名为 cron)
ls -l /etc/crontab /etc/cron.d/七列格式的含义
| 列 | 含义 | 取值示例 |
|---|---|---|
| 1 | 分钟 | 0-59、*/5 表示每 5 分钟 |
| 2 | 小时 | 0-23,支持区间与列表 |
| 3 | 日 | 1-31 |
| 4 | 月 | 1-12 |
| 5 | 星期 | 0-7,0 与 7 都表示周日 |
| 6 | 执行身份 | root、appuser 等系统用户(用户 crontab 没有这一列) |
| 7 | 命令 | 建议写绝对路径,并把输出重定向到日志 |
同一目录下的 /etc/cron.d/ 文件与 /etc/crontab 格式完全一致,都带用户列。按业务拆分文件放在 cron.d 下,比把大量任务都塞进 /etc/crontab 更好维护。
不要把系统级格式抄进用户 crontab:多出来的用户名字段会被当成命令的一部分,最终报「命令找不到」,而这个错误往往只在邮件或日志里才看得出来。