Crontab 是什么
Crontab 是 Linux 自带的定时任务管理工具。你告诉它”在什么时间执行什么命令”,它就会按计划自动执行。不用人工盯着,不用写复杂的脚本调度器。
常见的使用场景:
- 每天凌晨 3 点备份数据库
- 每隔 5 分钟检查服务是否存活
- 每周一早上 8 点清理日志文件
- 每月 1 号生成上月报表
Cron 表达式速查
Cron 表达式由 5 个字段组成,用空格分隔:
* * * * * 命令
│ │ │ │ │
│ │ │ │ └─── 星期几 (0-7, 0和7都是周日)
│ │ │ └───── 月份 (1-12)
│ │ └─────── 日期 (1-31)
│ └───────── 小时 (0-23)
└─────────── 分钟 (0-59)
常见写法示例:
0 3 * * * # 每天凌晨 3:00
30 8 * * 1-5 # 工作日 8:30
0 */6 * * * # 每 6 小时
*/15 * * * * # 每 15 分钟
0 0 1 * * # 每月 1 号 0:00
0 9 1,15 * * # 每月 1 号和 15 号 9:00
0 0 * * 0 # 每周日 0:00
基本操作
查看当前用户的定时任务
crontab -l

如果还没有任何定时任务,会提示 no crontab for username。
编辑定时任务
crontab -e

第一次执行会让你选择编辑器,推荐选 vim.basic 或 nano(对新手更友好)。
编辑后保存退出,crontab 会自动安装新配置。可以用 crontab -l 确认是否生效。
删除所有定时任务
crontab -r
⚠️ 这个操作不可逆,会删除所有定时任务! 如果不确定,先 crontab -l > /tmp/crontab_backup 备份一下。
以 root 身份管理其他用户的定时任务
crontab -u username -l # 查看
crontab -u username -e # 编辑
写定时任务的注意事项
用绝对路径
Cron 执行时的环境变量和你手动执行时不一样。特别是 PATH,Cron 默认的 PATH 很短,可能找不到你常用的命令。
# ❌ 错误写法
0 3 * * * python3 /opt/backup.py
# ✅ 正确写法
0 3 * * * /usr/bin/python3 /opt/backup.py
如果你不确定命令的完整路径,用 which 命令名 查一下。
重定向输出
Cron 执行时的输出默认会发邮件给系统用户。如果你不需要这些邮件,记得重定向:
# 丢弃所有输出
0 3 * * * /opt/backup.sh > /dev/null 2>&1
# 保存日志
0 3 * * * /opt/backup.sh >> /var/log/backup.log 2>&1
设置环境变量
如果你的脚本依赖特定的环境变量,可以在 crontab 文件开头设置:
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
JAVA_HOME=/usr/lib/jvm/java-11
0 3 * * * $JAVA_HOME/bin/java -jar /opt/app.jar > /dev/null 2>&1
百分号需要转义
在 crontab 中,% 有特殊含义(会被解释为换行),必须用反斜杠转义:
# ❌ 错误
0 3 * * * date +%F >> /tmp/date.log
# ✅ 正确
0 3 * * * date +\%F >> /tmp/date.log
实用示例
定时备份数据库
# 每天凌晨 3 点备份 MySQL,保留 7 天
0 3 * * * mysqldump -u root -p'your_password' dbname > /backup/db_$(date +\%Y\%m\%d).sql && find /backup -name "db_*.sql" -mtime +7 -delete > /dev/null 2>&1
定时清理日志
# 每周日凌晨 2 点清理 Nginx 30 天前的日志
0 2 * * 0 find /var/log/nginx -name "*.log.gz" -mtime +30 -delete > /dev/null 2>&1
定时监控服务
# 每 5 分钟检查 Nginx 是否在运行,挂了就自动重启
*/5 * * * * systemctl is-active nginx > /dev/null || systemctl restart nginx > /dev/null 2>&1
定时同步文件
# 每天凌晨 4 点用 rsync 同步数据到备份服务器
0 4 * * * rsync -avz --delete /data/ user@backup-server:/backup/data/ > /dev/null 2>&1
调试技巧
检查 Cron 日志
# CentOS
cat /var/log/cron
# Ubuntu
cat /var/log/syslog | grep CRON
# 或
journalctl -u cron
任务不执行怎么办
- 确认 Cron 服务在运行——
systemctl status crond(CentOS)或systemctl status cron(Ubuntu) - 检查语法——确保 crontab 文件每行末尾没有多余空格,命令路径正确
- 手动执行命令——先把命令复制到终端手动跑一遍,确认能正常工作
- 检查输出重定向——如果没有重定向,查看系统邮件:
mail或cat /var/mail/username - 检查权限——确保脚本有执行权限:
chmod +x /opt/script.sh
Cron 目录方式
除了用 crontab -e 编辑,你还可以把脚本放到特定目录,系统会自动执行:
/etc/cron.hourly/ # 每小时
/etc/cron.daily/ # 每天
/etc/cron.weekly/ # 每周
/etc/cron.monthly/ # 每月
只需要把脚本放进去并赋予执行权限就行,不用写 cron 表达式。适合固定周期的简单任务。
总结
Crontab 就三步:查看(-l)、编辑(-e)、等它执行。记住几个要点:
- 用绝对路径
- 重定向输出
- 转义百分号
- 先手动测试再写入 crontab
crontab -e # 编辑定时任务
0 3 * * * /usr/bin/python3 /opt/job.py # 示例:每天 3 点执行
systemctl status crond # 检查服务状态
掌握 Crontab,服务器的自动化运维就迈出了第一步。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END











