crontab 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
crontab——日志、时间与计划任务命令族(见日志与时间命令族)。它让命令在指定时间周期性自动运行。
crontab 是 cron(Linux 的定时任务守护进程)的用户级配置命令。你写下"每天凌晨 3 点跑备份""每 5 分钟检查一次",cron 守护进程就按时拉起你的命令。它是服务器自动化(备份、清理、巡检)的基石。
一、5 段式时间格式
分 时 日 月 周 命令
* * * * * /path/to/job.sh
│ │ │ │ │
│ │ │ │ └─ 星期几(0-6,0=周日,或 7)
│ │ │ └──── 月份(1-12)
│ │ └─────── 日(1-31)
│ └────────── 小时(0-23)
└───────────── 分钟(0-59)0 3 * * * /backup.sh # 每天 3:00
*/5 * * * * /check.sh # 每 5 分钟
0 0 1 * * /monthly.sh # 每月 1 日 0:00
30 2 * * 1 /weekly.sh # 每周一 2:30
0 0 * * 0 /clean.sh # 每周日 0:00五个
*是"每"的意思。*/5是"每 5 单位",-表范围(如9-17),,表列举(如1,15)。记忆口诀:分时日月周。最容易错的是"周几"和"日"同时设非*时是"或"的关系(满足任一即触发),别写成"且"。
二、编辑与查看
crontab -e # 编辑当前用户的定时任务(调起默认编辑器)
crontab -l # 列出当前用户的任务
crontab -r # 删除当前用户全部任务(危险!无确认)
crontab -u other -l # 看其他用户的任务(需 root)
crontab -e编辑、-l查看。-r是删除全部、没有二次确认,误敲会清空所有定时任务——删单条请用-e进编辑器删那一行,别用-r。企业里常把 crontab 内容纳入版本管理,避免误删后无法恢复。
三、环境变量陷阱(高频坑)
# 很多命令在交互 shell 能跑,放 crontab 就失败
*/5 * * * * /usr/bin/python3 /app/job.py # 用绝对路径
*/5 * * * * cd /app && ./job.sh >> /app/job.log 2>&1 # 重定向看输出cron 的执行环境和你登录的 shell 完全不同:
PATH极简(通常只有/usr/bin:/bin)、没有你的.bashrc环境、工作目录是$HOME。所以:命令用绝对路径、需要环境就自己在脚本里 source 或 export、输出重定向到日志(否则 stdout/stderr 会寄到邮件,常被忽略)。这是"手动能跑、cron 跑不了"的头号原因。
四、看执行日志
# Debian/Ubuntu:看 cron 自身日志
grep CRON /var/log/syslog
# 或 journalctl(systemd)
journalctl -u cron -f
# 任务自己的输出(如果你重定向了)
tail -f /app/job.log任务"到底跑没跑、报什么错"——看 cron 守护进程日志(syslog 里的 CRON 条目,或
journalctl -u cron)。配合任务自身的输出重定向日志,排查很直接。cron 邮件(/var/mail/用户名)也收输出,但常被忽略,所以自己重定向更可靠。
五、实战:加一个备份任务
crontab -e
# 添加一行:每天 3 点打包 /var/www 到备份盘
0 3 * * * tar -czf /backup/www-$(date +\%Y\%m\%d).tar.gz /var/www >> /backup/backup.log 2>&1注意
date +%Y%m%d里的%在 crontab 里必须转义成\%,否则被 cron 当特殊字符(这是又一处隐蔽坑)。任务用绝对路径、输出重定向到日志,符合上面的"环境陷阱"规范。排障详见 日志与时间命令族。
相关命令
任务排障看 journalctl;时间格式离不开 date。
一句话总结
crontab = 周期定时任务(5 段:分 时 日 月 周):*/5 每 5 单位、- 范围、, 列举;-e 编辑/-l 查看/-r 删全部(无确认,慎敲)。最大坑是 cron 环境极简——命令用绝对路径、% 要转义、PATH 不含你的配置、输出要重定向;排障看 journalctl -u cron 与任务日志。自动化备份/清理/巡检的基石。