在Linux中,定时任务(cron)的灵活性在于通过时间字段的组合和命令的搭配,可适应多种场景。以下是一个包含不同典型场景的crontab
示例,涵盖了周期性执行、特定时间点执行、结合脚本、输出处理等常见需求:
示例crontab
配置(通过crontab -e
编辑)
# 1. 每天凌晨2:30自动备份MySQL数据库,并重定向输出到日志文件
30 2 * * * /usr/bin/mysqldump -u root -p'密码' 数据库名 > /backup/db_$(date +\%Y\%m\%d).sql 2>> /var/log/db_backup.log
# 2. 每周日凌晨3点清理/var/log目录下7天前的日志文件
0 3 * * 0 /usr/bin/find /var/log -name "*.log" -mtime +7 -delete >> /var/log/log_cleanup.log 2>&1
# 3. 每月1日上午10点生成上月服务器性能统计报告,并发送到指定邮箱
0 10 1 * * /usr/local/bin/stat_report.sh $(date -d 'last month' +\%Y) $(date -d 'last month' +\%m) | mail -s "上月性能报告" admin@example.com
# 4. 每小时的第15分钟检查Nginx服务状态,若停止则自动重启
15 * * * * /usr/bin/systemctl is-active nginx || /usr/bin/systemctl restart nginx
# 5. 工作日(周一至周五)下午5点执行数据同步脚本
0 17 * * 1-5 /data/scripts/sync_data.sh > /dev/null 2>&1
逐条解释说明
1. 每日数据库备份
30 2 * * * /usr/bin/mysqldump ...
-
时间字段:
30 2 * * *
表示“每天凌晨2点30分”30
:分钟(0-59)2
:小时(0-23,2即凌晨2点)*
:日(任意天)*
:月(任意月)*
:周(任意周)
-
命令部分:
mysqldump
:MySQL备份工具,需指定绝对路径(/usr/bin/
),避免cron环境变量缺失导致命令找不到。> /backup/db_$(date +\%Y\%m\%d).sql
:将备份内容输出到以“日期”命名的文件(如db_20231001.sql
),\%
是转义符(cron中%
需转义)。2>> /var/log/db_backup.log
:将错误信息(标准错误流2)追加到日志文件,方便排查备份失败原因。
2. 每周日志清理
0 3 * * 0 /usr/bin/find ...
-
时间字段:
0 3 * * 0
表示“每周日凌晨3点”0
:分钟(整点)3
:小时(凌晨3点)0
:周(0表示周日,1-6对应周一至周六)
-
命令部分:
find /var/log -name "*.log" -mtime +7 -delete
:查找/var/log
下7天前(-mtime +7
)的.log
文件并删除。>> /var/log/log_cleanup.log 2>&1
:将标准输出和错误(2>&1
表示错误流重定向到标准输出)都追加到日志,记录清理情况。
3. 每月生成统计报告并发送邮件
0 10 1 * * /usr/local/bin/stat_report.sh ...
-
时间字段:
0 10 1 * *
表示“每月1日上午10点”1
:日(每月1日)
-
命令部分:
stat_report.sh $(date -d 'last month' +\%Y) $(date -d 'last month' +\%m)
:执行自定义脚本,传入“上月年份”和“上月月份”作为参数(如10月1日传入2023和09)。| mail -s "上月性能报告" admin@example.com
:将脚本输出通过管道传给mail
命令,发送邮件给管理员。
4. 每小时检查并重启服务
15 * * * * /usr/bin/systemctl is-active nginx || /usr/bin/systemctl restart nginx
-
时间字段:
15 * * * *
表示“每小时的第15分钟”15
:分钟(每小时15分)*
:小时(任意小时)
-
命令部分:
systemctl is-active nginx
:检查Nginx状态,若运行中返回0(成功),否则返回非0。||
:逻辑“或”,若前半部分失败(服务停止),则执行后半部分systemctl restart nginx
重启服务。
5. 工作日执行数据同步
0 17 * * 1-5 /data/scripts/sync_data.sh > /dev/null 2>&1
-
时间字段:
0 17 * * 1-5
表示“每周一至周五下午5点”17
:小时(下午5点)1-5
:周(1=周一,5=周五)
-
命令部分:
sync_data.sh
:自定义数据同步脚本。> /dev/null 2>&1
:将所有输出(标准输出和错误)丢弃(/dev/null
是“黑洞”设备),适合无需记录的常规任务,避免cron发送冗余邮件。
注意事项
- 路径问题:cron的环境变量精简,命令和脚本需用绝对路径(如
/usr/bin/mysqldump
而非mysqldump
)。 - 权限问题:执行的脚本需有可执行权限(
chmod +x 脚本名
),且cron用户(如root)需有操作目标文件/目录的权限。 - 时间格式:周和日同时设置时,满足其一即执行(如
0 0 1 1 0
表示“1月1日”或“周日”,若1月1日是周日则只执行一次)。 - 输出处理:避免任务输出无意义信息,可通过
> /dev/null 2>&1
丢弃,或重定向到日志文件便于排查。
通过上述组合,可覆盖日常运维中备份、清理、监控、报告等大部分定时任务需求。