Linux 定时任务完全指南:crontab 配置与实例
一、引言
定时任务是 Linux 系统中实现自动化运维的基础功能。无论是日志清理、数据备份,还是定时发送报告,crontab 都能帮助我们按预定计划自动执行任务。
二、crontab 基础语法
# crontab 时间表达式格式
┌───────────── 分钟 (0 - 59)
│ ┌───────────── 小时 (0 - 23)
│ │ ┌───────────── 日期 (1 - 31)
│ │ │ ┌───────────── 月份 (1 - 12)
│ │ │ │ ┌───────────── 星期 (0 - 6,0=周日)
│ │ │ │ │
* * * * * command
特殊字符
- # 任意值
, # 列出多个值,如 1,3,5
- # 范围,如 1-5
/ # 步长,如 */5
常用示例
*/5 * * * * # 每5分钟
0 * * * * # 每小时整点
0 0 * * * # 每天午夜
0 2 * * * # 每天凌晨2点
0 3 * * 0 # 每周日凌晨3点
0 0 1 * * # 每月1日午夜
0 0 1,15 * * # 每月1日和15日午夜
*/10 9-17 * * 1-5 # 工作日9点到17点每10分钟
三、crontab 管理命令
# 查看当前用户的 crontab 任务
crontab -l
编辑当前用户的 crontab 任务
crontab -e
删除当前用户的所有 crontab 任务
crontab -r
直接替换 crontab 文件
crontab - < /path/to/crontab_file.txt
以指定用户身份运行任务(需要 root 权限)
crontab -u www-data -l
系统级 crontab 位置
/etc/crontab # 系统主 crontab
/etc/cron.d/ # 分散的定时任务配置
/etc/cron.daily/ # 每日执行的任务脚本
/etc/cron.hourly/ # 每小时执行的任务脚本
四、环境变量与路径问题
# crontab 环境变量问题
解决方案一:在 crontab 开头设置 PATH
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
完整 crontab 文件示例:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
每天凌晨2点执行备份脚本
0 2 * * * /opt/backup.sh >> /var/log/backup.log 2>&1
解决方案二:使用绝对路径
0 2 * * * /usr/bin/python3 /opt/analyze.py
日志重定向说明
> file 覆盖写入
>> file 追加写入
2>&1 错误输出重定向到标准输出
/dev/null 丢弃输出
示例:丢弃所有输出
0 3 * * * /opt/script.sh > /dev/null 2>&1
五、常见实战案例
# 案例1:每日数据库备份
0 2 * * * mysqldump -u root -p'YourPassword' mydb | gzip > /backup/mydb_$(date +\%Y\%m\%d).sql.gz
案例2:日志清理
0 4 * * * find /var/log -name "*.log" -mtime +30 -exec rm -f {} \;
案例3:同步文件到远程服务器
0 1 * * * rsync -avz /data/backup/ ubuntu@remote:/backup/ >> /var/log/rsync.log 2>&1
案例4:发送系统报告邮件
0 9 * * 1 df -h; free -h; who; uptime | mail -s "Weekly System Report" admin@example.com
案例5:自动更新 SSL 证书
0 3 1 * * /usr/bin/certbot renew --quiet
案例6:监控服务是否存活
*/5 * * * * /usr/bin/pgrep -f nginx > /dev/null || /usr/bin/systemctl restart nginx
案例7:清理临时文件
0 3 * * * find /tmp -type f -mtime +7 -delete 2>/dev/null
案例8:监控磁盘空间
0 8 * * * ROOT_USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
[ "$ROOT_USAGE" -gt 80 ] && echo "磁盘空间告警:${ROOT_USAGE}%" | mail -s "Disk Alert" admin@example.com
六、anacron 与系统定时任务
# anacron 用于确保在计算机关机期间错过的定时任务
下次开机时会自动执行遗漏的任务
/etc/anacrontab 示例:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
每天开机5分钟后执行 cron.daily 任务
@daily 5 cron.daily run-parts /etc/cron.daily
每周开机10分钟后执行 cron.weekly 任务
@weekly 10 cron.weekly run-parts /etc/cron.weekly
每月开机15分钟后执行 cron.monthly 任务
@monthly 15 cron.monthly run-parts /etc/cron.monthly
七、常见问题(FAQ)
Q1: crontab 任务不执行,怎么排查?
检查步骤:1)确认 cron 服务运行中(systemctl status cron);2)检查 crontab 语法;3)查看 cron 日志(/var/log/syslog);4)确认脚本有执行权限;5)检查路径是否使用绝对路径。
Q2: 如何让 crontab 任务在系统重启后自动执行?
crontab 本身不支持开机自启动,需要配合 @reboot 语法或把脚本加入开机启动机制(systemd service 等)。
Q3: crontab 中的 % 符号有什么特殊含义?
% 在 crontab 中是特殊字符,表示换行。在 date 等命令中使用时需要转义为 \%。
Q4: 多个任务同时执行会影响性能吗?
crontab 本身是串行执行的。如果需要并行处理大量任务,可以用 flock 锁机制避免冲突。
八、延伸阅读
- Linux Shell 脚本编程入门:编写可在 cron 中调用的脚本
- Linux 文本处理三剑客:日志分析与数据处理技巧
- Linux 环境变量与脚本调试:理解 PATH 与环境配置