
吃透 Cron 定时任务:20 个高频实用案例 + 全场景使用指南
Cron 是 Linux/Unix 系统中最核心的定时任务工具,通过简单的语法规则,能让系统自动执行脚本、备份数据、清理日志等操作,是运维工程师、开发人员的必备技能。本文不仅讲解 Cron 核心语法,还整理了 20 个生产环境中高频使用的定时任务案例,覆盖数据备份、日志清理、系统监控、业务调度等场景,新手也能直接复制使用。
一、先掌握:Cron 核心基础(避免语法踩坑)
在看案例前,先快速掌握 Cron 的核心规则,确保案例能正确运行。
1. Cron 语法结构
Cron 定时任务的基本格式为「分时日月周 执行命令」,共 6 个字段,每个字段含义如下:
| 字段 | 取值范围 | 特殊符号说明 |
|---|---|---|
| 分钟 | 0-59 | *(每分钟)、,(分隔多个值,如 1,30)、-(范围,如 10-20)、*/n(每隔 n 分钟,如 */15) |
| 小时 | 0-23 | 同分钟规则 |
| 日 | 1-31 | 同分钟规则(注意月份天数,避免无效值) |
| 月 | 1-12 | 可缩写为 jan/feb.../dec,同分钟规则 |
| 周 | 0-7 | 0 和 7 均表示周日,可缩写为 sun/mon.../sat,同分钟规则 |
| 命令 | 任意可执行命令 / 脚本路径 | 建议使用绝对路径(如/usr/bin/rm,避免环境变量问题) |
2. 核心操作命令
# 编辑当前用户的定时任务(最常用)
crontab -e
# 查看当前用户的定时任务列表
crontab -l
# 删除当前用户的所有定时任务(谨慎使用)
crontab -r
# 重启crond服务(修改配置后生效,CentOS 7)
systemctl restart crond
3. 关键注意事项
- 命令 / 脚本必须用绝对路径(如
/data/backup.sh,而非backup.sh); - 定时任务执行日志默认不输出,建议重定向到日志文件(如
>> /var/log/cron_task.log 2>&1); - 避免任务重叠执行(如耗时任务需加锁,或调整执行间隔);
- 测试任务可先设为每分钟执行(
* * * * *),验证成功后再调整频率。
二、20 个 Cron 高频实用案例(直接复制可用)
以下案例覆盖运维、开发、数据管理等场景,均标注「执行频率 + 用途 + 命令 + 说明」,适配 CentOS 7/Ubuntu 等主流 Linux 系统。
场景 1:数据备份类(核心运维场景)
案例 1:每天凌晨 2 点全量备份 MySQL 数据库
# 频率:每天2:00执行
# 用途:自动备份MySQL数据库,避免数据丢失
0 2 * * * /usr/bin/mysqldump -u root -p'你的密码' --all-databases | gzip > /data/backup/mysql_full_$(date +%Y%m%d).sql.gz >> /var/log/mysql_backup.log 2>&1
说明:
$(date +%Y%m%d):生成年月日后缀(如 20251204),避免备份文件覆盖;gzip:压缩备份文件,节省磁盘空间;- 建议定期清理旧备份(结合案例 6)。
案例 2:每周日凌晨 3 点备份 Nginx 配置文件
# 频率:每周日3:00执行
# 用途:备份Nginx配置,防止配置修改出错无法回滚
0 3 * * 0 /bin/tar -zcvf /data/backup/nginx_conf_$(date +%Y%m%d).tar.gz /etc/nginx/ >> /var/log/nginx_backup.log 2>&1
说明:tar -zcvf:压缩并归档目录,保留配置文件完整结构。
案例 3:每小时增量备份业务日志
# 频率:每小时第0分钟执行
# 用途:增量备份核心业务日志,便于故障溯源
0 */1 * * * /bin/cp /var/log/app/app.log /data/backup/log/app_log_$(date +%Y%m%d_%H).log >> /var/log/log_backup.log 2>&1
说明:$(date +%Y%m%d_%H):生成 “年月日_小时” 后缀,区分不同时段的日志。
案例 4:每月 1 号凌晨 4 点备份服务器配置文件
# 频率:每月1日4:00执行
# 用途:定期备份系统关键配置(网卡、防火墙、Cron等)
0 4 1 * * /bin/tar -zcvf /data/backup/system_conf_$(date +%Y%m).tar.gz /etc/sysconfig/ /etc/crontab /etc/ssh/ >> /var/log/system_backup.log 2>&1
说明:仅备份每月 1 日,后缀保留 “年月”(如 202512),减少文件数量。
案例 5:每天凌晨 5 点备份 Redis 数据
# 频率:每天5:00执行
# 用途:备份Redis持久化文件(RDB/AOF)
0 5 * * * /bin/cp /var/lib/redis/dump.rdb /data/backup/redis/redis_dump_$(date +%Y%m%d).rdb >> /var/log/redis_backup.log 2>&1
说明:需确认 Redis 持久化文件路径(可通过redis-cli config get dir查看)。
场景 2:日志 / 文件清理类(释放磁盘空间)
案例 6:每天凌晨 1 点清理 7 天前的 MySQL 备份文件
# 频率:每天1:00执行
# 用途:自动清理旧备份,避免磁盘占满
0 1 * * * /usr/bin/find /data/backup/mysql/ -name "mysql_full_*.sql.gz" -mtime +7 -exec rm -rf {} \; >> /var/log/clean_backup.log 2>&1
说明:
-mtime +7:匹配 7 天前的文件;-exec rm -rf {} \;:删除匹配到的文件({} 表示匹配结果,; 是固定语法)。
案例 7:每小时清理 Nginx 日志中的空行和重复记录
# 频率:每小时第30分钟执行
# 用途:优化日志文件,减少无效数据
30 */1 * * * /bin/sed -i '/^$/d' /var/log/nginx/access.log && /usr/bin/uniq /var/log/nginx/access.log > /var/log/nginx/access_temp.log && /bin/mv /var/log/nginx/access_temp.log /var/log/nginx/access.log >> /var/log/clean_nginx.log 2>&1
说明:
sed -i '/^$/d':删除空行;uniq:去重,临时文件中转避免日志丢失。
案例 8:每周六凌晨 6 点清理 /tmp 目录下 7 天未访问的文件
# 频率:每周六6:00执行
# 用途:清理临时目录,释放磁盘空间
0 6 * * 6 /usr/bin/find /tmp/ -type f -atime +7 -exec rm -rf {} \; >> /var/log/clean_tmp.log 2>&1
说明:-atime +7:匹配 7 天未访问的文件,-type f:仅匹配文件(不包含目录)。
案例 9:每天 23 点清理超过 100M 的 Tomcat 日志(保留最新内容)
# 频率:每天23:00执行
# 用途:截断大日志文件,避免删除后日志写入异常
0 23 * * * /usr/bin/find /usr/local/tomcat/logs/ -name "catalina.out" -size +100M -exec /bin/truncate -s 0 {} \; >> /var/log/clean_tomcat.log 2>&1
说明:truncate -s 0:清空文件但保留文件本身,避免 Tomcat 日志写入失败。
案例 10:每月 15 号凌晨 7 点清理过期的 SSL 证书文件
# 频率:每月15日7:00执行
# 用途:清理失效的SSL证书,避免配置混淆
0 7 15 * * /usr/bin/find /etc/nginx/ssl/ -name "*.pem" -mtime +365 -exec rm -rf {} \; >> /var/log/clean_ssl.log 2>&1
说明:-mtime +365:匹配 1 年前的证书文件(SSL 证书通常 1 年有效期)。
场景 3:系统监控 / 维护类(保障服务稳定)
案例 11:每分钟检查 Nginx 服务是否运行,停止则自动重启
# 频率:每分钟执行
# 用途:监控Nginx状态,自动恢复服务
* * * * * /usr/bin/pgrep nginx || /usr/bin/systemctl start nginx >> /var/log/nginx_monitor.log 2>&1
说明:
pgrep nginx:检查 Nginx 进程是否存在,返回 0 表示运行,非 0 表示停止;||:前面命令失败时执行后面的重启命令。
案例 12:每天上午 9 点检查磁盘使用率,超过 80% 则发送告警邮件
# 频率:每天9:00执行
# 用途:磁盘空间告警,提前预防磁盘满
0 9 * * * /bin/df -h | /usr/bin/awk '$5 > 80 {print $0}' | /usr/bin/mail -s "磁盘使用率超过80%" admin@yourdomain.com >> /var/log/disk_monitor.log 2>&1
说明:
df -h:查看磁盘使用率;awk '$5 > 80':筛选使用率超过 80% 的分区;- 需提前安装
mailx工具(yum install -y mailx)并配置邮件服务器。
案例 13:每 10 分钟同步系统时间到 NTP 服务器
# 频率:每10分钟执行
# 用途:保证系统时间精准,避免时间偏差
*/10 * * * * /usr/sbin/ntpdate ntp.aliyun.com >> /var/log/ntp_sync.log 2>&1
说明:需安装ntpdate工具(yum install -y ntpdate)。
案例 14:每周一凌晨 8 点检查服务器内存使用率,超过 90% 则释放缓存
# 频率:每周一8:00执行
# 用途:优化内存使用,避免OOM
0 8 * * 1 /usr/bin/free -m | /usr/bin/awk 'NR==2{if($3/$2*100 > 90) system("echo 1 > /proc/sys/vm/drop_caches")}' >> /var/log/memory_monitor.log 2>&1
说明:
free -m:查看内存使用(MB);echo 1 > /proc/sys/vm/drop_caches:释放页缓存(安全的内存清理方式)。
案例 15:每天凌晨 0 点重启 PHP-FPM 服务(解决内存泄漏)
# 频率:每天0:00执行
# 用途:定期重启PHP-FPM,避免长期运行导致内存泄漏
0 0 * * * /usr/bin/systemctl restart php-fpm >> /var/log/phpfpm_restart.log 2>&1
说明:部分 PHP 程序长期运行会内存泄漏,定期重启可避免服务异常。
场景 4:业务调度类(自动化业务操作)
案例 16:每天上午 10 点和下午 4 点执行 Python 数据统计脚本
# 频率:每天10:00、16:00执行
# 用途:定时生成业务数据报表
0 10,16 * * * /usr/bin/python3 /data/script/data_stat.py >> /var/log/data_stat.log 2>&1
说明:
10,16:表示 10 点和 16 点两个时间点;- 需确保 Python 脚本有执行权限(
chmod +x /data/script/data_stat.py)。
案例 17:工作日(周一至周五)下午 6 点执行订单自动结算脚本
# 频率:周一至周五18:00执行
# 用途:自动化业务结算,避免人工操作
0 18 * * 1-5 /bin/bash /data/script/order_settle.sh >> /var/log/order_settle.log 2>&1
说明:1-5:表示周一至周五(周字段)。
案例 18:每月最后一天晚上 10 点执行月度账单生成脚本
# 频率:每月最后一天22:00执行
# 用途:自动生成月度业务账单
0 22 * * * /bin/bash -c 'if [ $(date +%d -d tomorrow) = 01 ]; then /data/script/month_bill.sh; fi' >> /var/log/month_bill.log 2>&1
说明:
$(date +%d -d tomorrow) = 01:判断是否为当月最后一天(明天是 1 号则今天是最后一天);- 需用
bash -c包裹条件判断,Cron 才能识别。
案例 19:每天凌晨 3 点 30 分同步本地文件到远程服务器(rsync)
# 频率:每天3:30执行
# 用途:异地备份核心文件,提高数据安全性
30 3 * * * /usr/bin/rsync -avz /data/app/ root@192.168.1.200:/data/backup/app/ >> /var/log/rsync_sync.log 2>&1
说明:
- 需配置 SSH 免密登录(
ssh-copy-id root@192.168.1.200),避免手动输入密码; -avz:归档、显示详细信息、压缩传输。
案例 20:每小时第 15 分钟执行接口可用性检测脚本
# 频率:每小时15分执行
# 用途:监控核心接口,及时发现访问异常
15 */1 * * * /bin/bash /data/script/api_check.sh >> /var/log/api_check.log 2>&1
说明:api_check.sh示例(检测接口返回状态码):
#!/bin/bash
STATUS=$(curl -o /dev/null -s -w "%{http_code}" https://api.yourdomain.com/health)
if [ $STATUS -ne 200 ]; then
echo "$(date) - API访问失败,状态码:$STATUS" >> /var/log/api_error.log
fi
三、Cron 任务调试与排错技巧
- 测试命令有效性:先在终端手动执行命令,确认能正常运行(如
/usr/bin/mysqldump -u root -p'密码' --all-databases > /tmp/test.sql); - 查看 Cron 日志:CentOS 7 可通过
tail -f /var/log/cron查看任务执行记录,Ubuntu 可通过grep CRON /var/log/syslog; - 检查环境变量:Cron 的环境变量比终端少,建议在脚本开头添加
source /etc/profile加载系统环境; - 避免中文 / 特殊字符:脚本和日志路径避免包含中文、空格,防止解析失败;
- 任务加锁:耗时任务可加锁(如
flock -n /tmp/task.lock -c "执行命令"),避免重复执行。
总结
Cron 的核心价值是 “自动化重复操作”,20 个案例覆盖了运维核心场景,使用时需注意 3 个关键点:
- 命令 / 脚本必须用绝对路径,避免环境变量导致执行失败;
- 任务执行结果建议重定向到日志文件,便于排查问题;
- 定时频率需结合业务场景,避免高频任务占用系统资源(如每分钟备份会消耗大量 CPU / 磁盘)。
3万+

被折叠的 条评论
为什么被折叠?



