Day 4:定时任务 crontab
Day 4:定时任务 crontab
今日目标:会设置、查看、删除定时任务——让机器在指定时间自动执行你的脚本 🎯
命令速览
| 命令 | 用途 |
|---|---|
crontab -e |
编辑当前用户的定时任务 |
crontab -l |
查看当前用户的定时任务 |
crontab -r |
删除当前用户的所有定时任务 |
逐个击破
① crontab 时间格式
格式:分 时 日 月 周 命令
| 位置 | 含义 | 取值范围 |
|---|---|---|
| 第 1 位 | 分钟 | 0-59 |
| 第 2 位 | 小时 | 0-23 |
| 第 3 位 | 日 | 1-31 |
| 第 4 位 | 月 | 1-12 |
| 第 5 位 | 星期 | 0-7(0 和 7 都表示周日) |
特殊符号:
*→ 每个时间单位*/N→ 每隔 N 个单位N,M,K→ 枚举(第 N、M、K 个单位)N-M→ 范围(N 到 M)
常见示例:
| 表达式 | 含义 |
|---|---|
*/5 * * * * |
每 5 分钟 |
0 * * * * |
每小时整点 |
0 2 * * * |
每天凌晨 2:00 |
30 8 * * 1-5 |
工作日 8:30 |
0 0 1 * * |
每月 1 号 0:00 |
0 0 * * 0 |
每周日 0:00 |
@reboot |
系统启动时(部分系统支持) |
② crontab 操作
上手练 🖥️:
查看:
crontab -l——看看当前用户有没有定时任务编辑:
crontab -e——打开编辑器,添加以下行:1
2# 每 2 分钟向文件写入一条记录
*/2 * * * * echo "$(date): cron test" >> /tmp/cron-test.log保存退出后,等 2 分钟检查
/tmp/cron-test.log:1
cat /tmp/cron-test.log
验证生效:
1
tail -f /tmp/cron-test.log # 等待 cron 写入
删除:先查看再删除
1
2
3crontab -l > /tmp/cron-backup.txt # 备份
crontab -r # 删除所有
crontab -l # 确认已删除恢复:
crontab /tmp/cron-backup.txt——从文件恢复定时任务以其他用户身份操作:
sudo crontab -u username -l——查看指定用户的 crontab
⚠️ 致命坑:
crontab -r不会确认,直接删除所有定时任务——先-l备份再-r- cron 的环境变量很少(PATH 很短),脚本里要用绝对路径
- cron 的输出默认会通过邮件发送(如果系统有邮件服务),重定向到文件避免邮件堆积
- 按天(第 3 位)和按周(第 5 位)同时指定成非
*值时是”或”的关系,不是你想要的”且”
③ 定时任务最佳实践
1 | # 正确示例(全部使用绝对路径,重定向输出) |
排查 cron 不执行的标准步骤:
- 检查 cron 服务是否运行:
systemctl status cron(或crond) - 检查命令用绝对路径了吗?(在 cron 里
PATH=/usr/bin:/bin通常很有限) - 检查脚本是否有执行权限:
chmod +x script.sh - 查看 cron 日志:
grep CRON /var/log/syslog - 先重定向输出到文件看报错:
* * * * * /path/script >> /tmp/debug.log 2>&1
今日必刷(全部终端实操)💪
- 添加一个定时任务:每 1 分钟向
/tmp/heartbeat.log写入当前时间 - 等待 3 分钟,查看
/tmp/heartbeat.log确认任务在执行 - 备份当前 crontab,然后添加一个每天凌晨 3:00 执行的任务(命令任意)
- 确认无误后,用
crontab -r删除所有,再从备份恢复 - 排错题:你在 crontab 里加了
*/2 * * * * /home/user/cleanup.sh,脚本手动执行正常,但 cron 不执行——写出排查清单,按顺序排查 - 排错题:你想让脚本在”既是一个月的 5 号、又恰好是周五”时执行,于是写了
0 2 5 * 5——结果发现脚本在每个月 5 号(无论周几)和每个周五(无论几号)都会执行。为什么会这样?提示:当”日”(第 3 位)和”周”(第 5 位)同时为非*值时,cron 的匹配逻辑是”或”还是”且”?怎么修正才能实现真正的”且”?(提示:在脚本开头用date判断)
📚 命令详解
| 命令 | 详细参考 |
|---|---|
crontab |
系统管理-crontab |