crontab 手册(Ubuntu)

本文以 Ubuntu 为准,介绍 crontab 的基本用法。crontab 用于配置和管理定时任务(Cron Jobs),可按分钟、小时、日、月、周等周期自动执行命令或脚本。

📌 基本概念

  • Cron:Linux 的定时任务守护进程(croncrond)。
  • crontab:每个用户可拥有一个独立的 cron 任务表(即 cron table),通过 crontab 命令管理。
  • 用户级任务文件默认存储在 /var/spool/cron/crontabs/(Ubuntu 使用 /var/spool/cron/crontabs/用户名)。
  • 系统级定时任务位于 /etc/crontab/etc/cron.d/ 目录。

⚠️ 普通用户只能管理自己的 crontab,不能直接编辑 /etc/crontab(需 root 权限)。

🔧 常用命令

命令作用示例
crontab -e编辑当前用户的定时任务crontab -e
crontab -l列出当前用户的定时任务crontab -l
crontab -r删除当前用户的所有定时任务(慎用!)crontab -r
crontab -u 用户名 -l(root 专用)查看指定用户的 crontabsudo crontab -u www-data -l

💡 编辑时默认使用 $VISUAL$EDITOR 环境变量指定的编辑器(如未设置,通常为 nanovi)。

🕒 Cron 表达式格式

每行一个任务,格式如下:

* * * * * command-to-execute
│ │ │ │ │
│ │ │ │ └── 星期几(0-7,0 和 7 均表示周日)
│ │ │ └──── 月份(1-12)
│ │ └────── 日期(1-31)
│ └──────── 小时(0-23)
└────────── 分钟(0-59)

常见示例

表达式含义
0 2 * * * /backup.sh每天凌晨 2:00 执行 /backup.sh
*/5 * * * * /check.sh每 5 分钟执行一次
0 0 1 * * /monthly.sh每月 1 日 00:00 执行
30 8 * * 1-5 /work.sh工作日(周一至周五)早上 8:30 执行

✅ 支持特殊符号:*(任意)、,(列表)、-(范围)、/(步长)

📝 编写建议

  1. 使用绝对路径
    Cron 环境变量有限,建议命令和脚本使用完整路径:
    0 1 * * * /usr/bin/python3 /home/user/script.py
  2. 重定向输出(避免邮件堆积)
    默认会将命令输出通过邮件发送给用户(若安装了 mail 系统)。建议重定向:
    */10 * * * * /script.sh >> /var/log/script.log 2>&1
    # 或静默丢弃:
    */10 * * * * /script.sh >/dev/null 2>&1
  3. 测试脚本可执行性
    确保脚本具有执行权限:chmod +x /path/to/script.sh

🔍 查看执行日志

Ubuntu 默认将 cron 日志记录在 syslog 中:

# 查看所有 cron 相关日志
sudo grep CRON /var/log/syslog
 
# 实时跟踪
sudo grep CRON /var/log/syslog | tail -f

📌 日志内容示例:
Dec 12 02:00:01 hostname CRON[12345]: (user) CMD (/backup.sh)


⚠️ 注意事项

  • 修改 crontab 后无需重启服务,系统会自动加载。
  • 若任务未执行,请检查:
    • cron 服务是否运行:sudo systemctl status cron
    • 脚本路径、权限、依赖环境是否正确
    • 是否有输出未处理导致卡住(建议重定向)
  • crontab -r 不可恢复!删除前建议先 crontab -l > backup.cron