服务器上很多事需要定时做:每天备份数据库、凌晨清理日志、定期检查磁盘空间、早上给网站发个测试邮件……手动做太累也容易忘。Linux 的 crontab 就是干这个的:按设定好的时间,自动执行脚本或命令,一天 24 小时无人值守也能按时"打卡上班"。这篇文章把 crontab 的语法、常用命令和几个实战案例讲清楚。
一、crontab 是做什么的
crontab 是 Linux 内置的定时任务工具,由后台守护进程 crond 统一调度。你只需写一行"在什么时间,执行什么命令",它就会到点自动跑。装系统一般自带,先确认服务在跑:
systemctl status crond # CentOS 用 crond
# 或
systemctl status cron # Ubuntu/Debian 用 cron
若没启动:
systemctl start cron && systemctl enable cron
二、crontab 常用命令
crontab -l # 查看当前用户的定时任务
crontab -e # 编辑定时任务(默认 vi)
crontab -r # 删除所有定时任务
crontab -u 用户名 -l # 查看指定用户的任务(需 root)
第一次用 crontab -e 会提示选择编辑器,选 1(nano)或 3(vim)都行。-e 打开后,每行一个任务,格式如下。
三、crontab 语法详解
一行任务的基本格式是五段"时间" + 一条命令:
分 时 日 月 周 要执行的命令
| 字段 | 范围 | 说明 |
|---|---|---|
| 分 | 0-59 | 第几分钟执行 |
| 时 | 0-23 | 第几小时执行 |
| 日 | 1-31 | 每月的第几天 |
| 月 | 1-12 | 每年的第几月 |
| 周 | 0-7 | 星期几(0 和 7 都指周日) |
每个字段的取值规则:
*:每个时间单位都执行(每分钟/每小时…),:列举多个,如1,15,30表示第 1、15、30 分-:范围,如9-18表示 9 点到 18 点/:间隔,如*/5表示每 5 个单位
记住一句话:分 时 日 月 周,从分钟开始写。
四、常用时间写法速查
*/5 * * * * 命令 # 每 5 分钟
0 * * * * 命令 # 每小时整点
0 3 * * * 命令 # 每天凌晨 3 点
30 2 * * 1 命令 # 每星期一凌晨 2:30
0 9 1 * * 命令 # 每月 1 号上午 9 点
0 0 1 1 * 命令 # 每年 1 月 1 日 0 点(新年任务)
写错最常犯的是"每 5 分钟"写成 5 * * * *(那是第 5 分钟执行一次)。每 N 时间要用 */N。
五、实战案例
1. 每天凌晨 3 点备份 MySQL 数据库:
先写一个备份脚本 /root/backup_db.sh:
#!/bin/bash
mkdir -p /backup/mysql
mysqldump -u root -p'你的密码' --all-databases > /backup/mysql/db_$(date +%Y%m%d).sql
find /backup/mysql -name "*.sql" -mtime +7 -delete # 只保留最近 7 天
加执行权限并写进 crontab:
chmod +x /root/backup_db.sh
crontab -e
# 加入一行:
0 3 * * * /root/backup_db.sh >> /var/log/backup.log 2>&1
>> 文件 2>&1 把输出和报错都记到日志,方便排查。
2. 每天清理日志文件:
0 0 * * * find /var/log -name "*.log" -mtime +30 -delete
3. 定期检查磁盘并告警:
0 20 * * * df -h / | awk 'NR>1 && int($5)>80 {echo "磁盘将满"; }'
(更专业的磁盘检查和清理可配合本站磁盘清理、日志切割教程。)
4. 定时给接口做健康检查 / 发测试邮件:
*/10 * * * * curl -s -o /dev/null -w "%{http_code}" http://localhost/ | grep -q 200 || echo "站点挂了"
六、crontab 的常见坑
坑 1:脚本里引用了系统全局变量/路径找不到
crontab 运行环境很"干净",没有你 shell 里那些 PATH。脚本开头尽量写绝对路径,并在脚本内设置:
#!/bin/bash
source /etc/profile
命令也用全路径,如 /usr/bin/mysqldump。
坑 2:脚本不执行?先手动试 + 看日志
先手动执行一遍脚本确认能成功,再看 cron 日志:
cat /var/log/cron # CentOS / Ubuntu 的 cron 日志位置可能不同
# 或
grep CRON /var/log/syslog # Debian 系
还要确认 crontab 里写的是绝对路径、有执行权限。
坑 3:权限问题
crontab -e 编辑的是当前用户的任务,备份、清日志这类需要 root 权限的操作,要用 root 用户(sudo crontab -e)设置。
坑 4:命令带特殊字符 / % 号
cron 里 % 会被当成换行,命令里若有 %(如 date +%Y)要转义成 \%,或者干脆写进脚本文件再执行,更省心。
七、校验要执行的脚本
crontab 只负责到点触发,不会帮你检查脚本对不对。任何任务上线前,先在命令行手动跑一遍脚本,确认无报错、产物正确,再交给 cron,否则到点执行的是"坏"命令。
八、配合其他工具使用
- 定时备份 + 本站的 rsync 同步异机,双保险
- 日志清理 + 本站的 Nginx 日志切割 / logrotate,磁盘永不满
- 复杂编排可用 Systemd Timer 替代 crontab,功能更严格、可管理性更好(参考本站 systemctl 教程)
总结
crontab 让你把"定时重复的事"一次性写进服务器,之后它自己到点干活。核心掌握:五段时间格式 分 时 日 月 周、*/N 表示每 N 个、脚本用绝对路径、上线前手动验证。抓住这几点,备份、清理、监控全都能自动化,运维省一大半心。
