Linux 定时任务完全指南:crontab 配置与实例

小飞兽 Shell 106 次阅读 2026-07-29

一、引言

定时任务是 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 锁机制避免冲突。

八、延伸阅读