Linux crontab 定时任务配置完全指南:从入门到精通
Linux crontab 是 Unix/Linux 系统中最经典的定时任务调度工具。无论是定时备份数据库、定期清理日志、自动更新系统、还是定时发送邮件通知,crontab 都能高效胜任。本文将全面介绍 crontab 的使用方法,从基础语法到高级技巧,帮助你彻底掌握 Linux 定时任务管理。
什么是 crontab?
crontab 是 cron table 的缩写。cron 是 Linux 系统的守护进程(daemon),负责在指定时间自动执行预定义的任务。每个用户都可以拥有独立的 crontab 文件来管理自己的定时任务。
1
| systemctl status cron # 查看 cron 服务状态
|
如果 cron 未运行,可以用以下命令启动:
1
| sudo systemctl enable --now cron
|
crontab 命令基础
常用命令
| 命令 | 说明 |
crontab -l | 列出当前用户的定时任务 |
crontab -e | 编辑当前用户的定时任务(默认用 vi) |
crontab -r | 删除当前用户的所有定时任务 |
crontab -u username -l | 查看指定用户的定时任务(需要 root 权限) |
crontab -u username -e | 编辑指定用户的定时任务 |
首次编辑
第一次执行 crontab -e 时,系统会提示选择编辑器。建议选择 nano(新手友好)或 vim(功能强大)。后续想更换编辑器可以用:
1 2 3
| select-editor export EDITOR=vim crontab -e
|
crontab 时间语法 - 五段式
crontab 的核心是时间表达式,由 5 个字段组成:
1 2 3 4 5 6 7 8
| * * * * * command_to_execute ─ ─ ─ ─ ─ │ │ │ │ │ │ │ │ │ └── 星期 (0-7, 0和7都表示周日) │ │ │ └──── 月份 (1-12) │ │ └────── 日期 (1-31) │ └──────── 小时 (0-23) └────────── 分钟 (0-59)
|
特殊字符
| 字符 | 含义 | 示例 |
* | 所有可能的值 | * * * * * 每分钟执行一次 |
, | 列举多个值 | 1,15,30 * * * * 每小时的第1、15、30分钟执行 |
- | 范围 | 9-17 * * * * 每天9点到17点每小时执行 |
/ | 步长 | */5 * * * * 每5分钟执行一次 |
常用时间表达式
| 表达式 | 含义 |
*/5 * * * * | 每5分钟 |
0 * * * * | 每小时整点 |
0 9 * * * | 每天早上9点 |
0 9,18 * * * | 每天早上9点和下午6点 |
0 2 * * * | 每天凌晨2点 |
0 0 * * * | 每天午夜0点 |
0 0 * * 0 | 每周日午夜0点 |
0 0 1 * * | 每月1日午夜0点 |
0 0 1 1 * | 每年1月1日午夜0点 |
*/30 9-18 * * 1-5 | 工作日9点到18点每30分钟 |
实战示例
1. 定时备份数据库
每天凌晨3点备份 MySQL 数据库,保留最近7天的备份:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| cat > /usr/local/bin/backup-mysql.sh << 'SCRIPT'
BACKUP_DIR="/var/backups/mysql" DB_NAME="myblog" DATE=$(date +\%Y\%m\%d_\%H\%M\%S) mysqldump -u root "$DB_NAME" | gzip > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +7 -delete SCRIPT
chmod +x /usr/local/bin/backup-mysql.sh
0 3 * * * /usr/local/bin/backup-mysql.sh
|
2. 定期清理日志文件
每周日凌晨4点清理 Nginx 日志:
1
| 0 4 * * 0 find /var/log/nginx -name "*.log" -mtime +30 -delete
|
3. 监控磁盘空间
每小时检查磁盘使用率,超过 90% 发送邮件告警:
1
| 0 * * * * df -h | awk '$5+0 > 90 {print $0}' | mail -s "Disk Alert" admin@example.com
|
4. 定时更新 SSL 证书(配合 certbot)
1 2
| 0 2 1,15 * * certbot renew --quiet
|
5. 定时同步文件(配合 rsync)
1 2
| 0 1 * * * rsync -avz --delete user@remote:/data/ /backup/data/
|
进阶技巧
1. 日志管理
crontab 默认将输出通过邮件发送给用户。对于生产环境,建议重定向日志:
1 2 3 4 5 6 7 8
| 0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
0 2 * * * /usr/local/bin/backup.sh > /dev/null 2>&1
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup_$(date +\%Y\%m\%d).log 2>&1
|
注意:在 crontab 中 % 是特殊字符,需要转义为 \%。
2. 环境变量问题
cron 执行时不会加载用户的 shell 配置文件(如 ~/.bashrc、~/.bash_profile),因此 PATH 环境变量非常有限。解决方法:
方法一:在脚本开头设置环境变量
1 2 3 4
| #!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin export PATH
|
方法二:在 crontab 中设置
1 2 3 4 5 6
| PATH=/usr/local/bin:/usr/bin:/bin SHELL=/bin/bash MAILTO=admin@example.com
0 2 * * * /usr/local/bin/backup.sh
|
3. 避免任务重叠
对于长时间运行的任务,需要防止上一个任务还没完成下一个就又开始执行。使用 flock 机制:
1 2
| */5 * * * * /usr/bin/flock -n /tmp/myjob.lock /usr/local/bin/myjob.sh
|
4. systemd timer - crontab 的现代替代
如果使用较新的 Linux 发行版,可以考虑用 systemd timer 替代 crontab,它提供更精确的控制和更好的日志管理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| cat > /etc/systemd/system/mybackup.timer << 'EOF' [Unit] Description=Daily Backup Timer
[Timer] OnCalendar=daily Persistent=true
[Install] WantedBy=timers.target EOF
cat > /etc/systemd/system/mybackup.service << 'EOF' [Unit] Description=Database Backup Service
[Service] Type=oneshot ExecStart=/usr/local/bin/backup.sh EOF
systemctl daemon-reload systemctl enable --now mybackup.timer
|
调试与排查
1. 查看 cron 执行日志
1 2 3 4 5 6 7 8
| sudo tail -f /var/log/syslog | grep CRON
sudo tail -f /var/log/cron
sudo journalctl -u cron --since today | grep -i fail
|
2. 常见问题排查
| 症状 | 可能原因 | 解决方法 |
| 任务未执行 | cron 服务未运行 | systemctl status cron 检查并启动 |
| 命令找不到 | PATH 环境变量未设置 | 在脚本中使用绝对路径或设置 PATH |
| 脚本未生效 | 脚本权限不足 | chmod +x script.sh |
| 日志无输出 | 输出重定向未配置 | 使用 >> /path/to/log 2>&1 |
| 时间不对 | 系统时区有误 | 使用 timedatectl 检查并修正时区 |
| % 被截断 | crontab 中 % 未转义 | 使用 \% 转义百分号 |
3. 手动测试脚本
在正式加入 crontab 之前,先手动测试脚本是否能正常运行:
1 2
| env -i HOME="$HOME" LOGNAME="$USER" SHELL=/bin/sh PATH=/usr/bin:/bin /usr/local/bin/backup.sh
|
安全提醒
- cron.allow 和 cron.deny:系统管理员可以通过这两个文件控制哪些用户可以使用 crontab。
/etc/cron.allow 优先级更高。
- 避免使用 root 执行不必要的任务:尽量使用普通用户权限运行定时任务。
- 日志轮转:长时间运行的 crontab 日志文件会非常大,建议配置 logrotate。
- 监控告警:关键定时任务失败时应当有通知机制。
1 2 3 4
| echo "root" > /etc/cron.allow echo "www-data" >> /etc/cron.allow
|
总结
crontab 是 Linux 运维中最基本也是最强大的工具之一。掌握它可以帮助你:
- 自动化重复性运维工作(备份、清理、监控)
- 定时执行业务逻辑(数据同步、报表生成)
- 配合脚本实现复杂的定时任务编排
核心要点总结:
- 时间表达式:五段式(分、时、日、月、周)
- 特殊字符:
*、,、-、/
- 环境变量:PATH 必须显式设置,否则命令可能找不到
- 日志管理:务必重定向输出,方便排查问题
- 安全实践:最小权限原则,使用 cron.allow 控制
掌握了 crontab,你就掌握了 Linux 自动化运维的钥匙。
本文由AI辅助生成,内容仅供参考