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 操作

  • 上手练 🖥️

    1. 查看crontab -l——看看当前用户有没有定时任务

    2. 编辑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
    3. 验证生效

      1
      tail -f /tmp/cron-test.log  # 等待 cron 写入
    4. 删除:先查看再删除

      1
      2
      3
      crontab -l > /tmp/cron-backup.txt  # 备份
      crontab -r # 删除所有
      crontab -l # 确认已删除
    5. 恢复crontab /tmp/cron-backup.txt——从文件恢复定时任务

    6. 以其他用户身份操作sudo crontab -u username -l——查看指定用户的 crontab

  • ⚠️ 致命坑

    • crontab -r 不会确认,直接删除所有定时任务——先 -l 备份再 -r
    • cron 的环境变量很少(PATH 很短),脚本里要用绝对路径
    • cron 的输出默认会通过邮件发送(如果系统有邮件服务),重定向到文件避免邮件堆积
    • 按天(第 3 位)和按周(第 5 位)同时指定成非 * 值时是”或”的关系,不是你想要的”且”

③ 定时任务最佳实践

1
2
3
4
5
# 正确示例(全部使用绝对路径,重定向输出)
*/10 * * * * /usr/bin/php /home/user/scripts/cleanup.php >> /var/log/cleanup.log 2>&1

# 错误示例(使用相对路径,cron 的 PATH 可能找不到)
*/10 * * * * php cleanup.php

排查 cron 不执行的标准步骤

  1. 检查 cron 服务是否运行:systemctl status cron(或 crond
  2. 检查命令用绝对路径了吗?(在 cron 里 PATH=/usr/bin:/bin 通常很有限)
  3. 检查脚本是否有执行权限:chmod +x script.sh
  4. 查看 cron 日志:grep CRON /var/log/syslog
  5. 先重定向输出到文件看报错:* * * * * /path/script >> /tmp/debug.log 2>&1

今日必刷(全部终端实操)💪

  1. 添加一个定时任务:每 1 分钟向 /tmp/heartbeat.log 写入当前时间
  2. 等待 3 分钟,查看 /tmp/heartbeat.log 确认任务在执行
  3. 备份当前 crontab,然后添加一个每天凌晨 3:00 执行的任务(命令任意)
  4. 确认无误后,用 crontab -r 删除所有,再从备份恢复
  5. 排错题:你在 crontab 里加了 */2 * * * * /home/user/cleanup.sh,脚本手动执行正常,但 cron 不执行——写出排查清单,按顺序排查
  6. 排错题:你想让脚本在”既是一个月的 5 号、又恰好是周五”时执行,于是写了 0 2 5 * 5——结果发现脚本在每个月 5 号(无论周几)和每个周五(无论几号)都会执行。为什么会这样?提示:当”日”(第 3 位)和”周”(第 5 位)同时为非 * 值时,cron 的匹配逻辑是”或”还是”且”?怎么修正才能实现真正的”且”?(提示:在脚本开头用 date 判断)

📚 命令详解

命令 详细参考
crontab 系统管理-crontab