Linux crontab 的核心是五字段交集匹配、环境隔离、分层管理与可观测性;需用绝对路径、显式声明变量、避免日/周冲突,并通过系统级目录或/etc/cron.d实现精细调度。

Linux 的 crontab 不只是“每分钟跑个脚本”那么简单。真正用好它,关键在于理解调度逻辑、规避环境陷阱、分层管理任务,并让定时动作可观察、可维护、可恢复。
掌握时间表达式的核心规则
crontab 时间字段共 5 位:分、时、日、月、周(0 或 7 表示周日)。它们不是孤立的,而是**同时生效的交集条件**——只有全部匹配才触发执行。
-
* 表示“任意有效值”,比如
0 2 * * *是每天凌晨 2 点;0 2 1 * *是每月 1 日凌晨 2 点(不一定是周一) -
逗号 表示“多选一”,如
0 8,14,20 * * *表示每天早 8 点、下午 2 点、晚 8 点各执行一次 -
连字符 表示连续范围,
0 9-17 * * 1-5是工作日早 9 点到晚 5 点整点执行 -
斜杠 表示步进,
*/10 * * * *是每 10 分钟一次;30 2 */2 * *是每隔一天凌晨 2:30 执行 -
星期和日期不要同时设为 * 以外的值,否则行为可能不符合直觉(例如
0 3 15 * 5表示“每月 15 日且是周五”,不是“每月 15 日或每周五”)
确保脚本能真正跑起来
写完 crontab 条目却没执行?八成卡在环境或权限上。
- 脚本必须有 可执行权限:
chmod +x /path/to/your/script.sh - crontab 中命令推荐使用绝对路径,包括 shell、命令、脚本、输出文件,例如:
/bin/bash /opt/scripts/backup.sh >> /var/log/backup.log 2>&1 - 默认环境变量极少(PATH 通常只有
/usr/bin:/bin),可在 crontab 文件顶部显式声明:SHELL=/bin/bash、PATH=/usr/local/bin:/usr/bin:/bin、HOME=/root - 测试时可临时加一条:
* * * * * date >> /tmp/cron_test.log 2>&1,确认 cron 服务运行且日志可写
按用途分层管理定时任务
别把所有任务都塞进个人 crontab。合理利用系统级机制,提升可维护性:
-
用户级任务(
crontab -e):适合个人运维脚本、开发环境检查等,配置存于/var/spool/cron/$USER -
系统级固定周期:放入
/etc/cron.daily/等目录(如日志轮转、磁盘清理),系统会自动按时间调用run-parts -
精细控制的系统任务:写进
/etc/cron.d/myjob,格式与 crontab 相同,但需额外指定执行用户,例如:0 4 * * * root /usr/local/bin/cleanup.sh - /etc/crontab 适合全局基础调度,注意其第六列是用户名字段,而用户 crontab 没有该列
实战中值得复用的高级技巧
解决真实场景中的典型难题:
-
每秒级调度:crontab 最小粒度是 1 分钟,可用
while true; do ...; sleep 1; done &启动后台循环,配合 systemd 服务管理更稳妥 -
每月最后一个周五:用
0 0 * * 5 [ $(date +\%m -d tomorrow) != $(date +\%m) ] && /path/to/script判断明天是否换月 -
动态读取配置调度:写一个 wrapper 脚本,先
source /etc/myapp/cron.conf获取参数(如备份保留天数、目标库名),再执行主逻辑 -
失败自动重试+告警:脚本末尾加判断,如
if [ $? -ne 0 ]; then echo "FAIL at $(date)" | mail -s "Cron Alert" admin@example.com; fi










