第172集:Cron 定时任务

核心知识点讲解

1. Cron 定时任务概述

Cron是Linux系统中内置的定时任务调度器,用于按照预定的时间自动执行命令或脚本。它是实现系统自动化运维的基础工具之一,广泛应用于日志轮转、备份、系统维护等场景。

2. Cron 语法结构

Cron表达式由5个时间字段组成,格式为:分 时 日 月 周 命令

字段 允许值 特殊字符
分钟 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * / ?
月份 1-12 , - * /
星期 0-7 (0和7都表示周日) , - * / ?

特殊字符含义:

  • *:匹配任意值
  • ,:分隔多个值
  • -:指定范围
  • /:指定步长
  • ?:仅用于日期和星期字段,表示不指定值

3. Cron 配置文件

3.1 系统级配置文件

  • /etc/crontab:系统级定时任务配置文件
  • /etc/cron.d/:存放系统级定时任务的目录
  • /etc/cron.hourly/:每小时执行的脚本目录
  • /etc/cron.daily/:每天执行的脚本目录
  • /etc/cron.weekly/:每周执行的脚本目录
  • /etc/cron.monthly/:每月执行的脚本目录

3.2 用户级配置文件

  • crontab -e:编辑当前用户的定时任务
  • crontab -l:查看当前用户的定时任务
  • crontab -r:删除当前用户的定时任务
  • crontab -u username -e:编辑指定用户的定时任务(需要root权限)

4. Cron 任务管理

4.1 添加定时任务

使用crontab -e命令编辑定时任务,格式如下:

# 每分钟执行一次命令
* * * * * command

# 每天凌晨1点执行命令
0 1 * * * command

# 每周一早上8点执行命令
0 8 * * 1 command

# 每月1日和15日中午12点执行命令
0 12 1,15 * * command

# 每小时的第15分钟执行命令
15 * * * * command

# 每两个小时执行一次命令
0 */2 * * * command

4.2 查看定时任务

# 查看当前用户的定时任务
crontab -l

# 查看指定用户的定时任务
crontab -u username -l

4.3 删除定时任务

# 删除当前用户的所有定时任务
crontab -r

# 删除指定用户的所有定时任务
crontab -u username -r

4.4 重启 Cron 服务

# 重启 cron 服务(Systemd)
systemctl restart cron

# 重启 crond 服务(SysVinit)
service crond restart

5. Cron 日志管理

Cron的执行日志通常存放在以下位置:

  • /var/log/cron.log:Ubuntu/Debian系统
  • /var/log/cron:CentOS/RHEL系统

可以通过查看日志了解定时任务的执行情况:

# 查看 cron 日志
tail -f /var/log/cron.log

# 搜索特定任务的执行记录
grep "command" /var/log/cron.log

实用案例分析

案例1:系统日志轮转

场景描述:需要每天凌晨自动执行日志轮转,防止日志文件过大。

解决方案

# 编辑定时任务
crontab -e

# 添加日志轮转任务
0 0 * * * /usr/sbin/logrotate /etc/logrotate.conf

实施效果

  • 系统日志每天自动轮转,保持日志文件大小合理
  • 避免了日志文件过大导致的磁盘空间不足问题

案例2:数据库备份

场景描述:需要每天凌晨2点自动备份MySQL数据库。

解决方案

  1. 创建备份脚本 backup_mysql.sh
#!/bin/bash

# 备份目录
BACKUP_DIR="/backup/mysql"

# 创建备份目录
mkdir -p $BACKUP_DIR

# 备份时间戳
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")

# 执行备份
mysqldump -u root -p密码 --all-databases > "$BACKUP_DIR/mysql_backup_$TIMESTAMP.sql"

# 压缩备份文件
gzip "$BACKUP_DIR/mysql_backup_$TIMESTAMP.sql"

# 删除7天前的备份文件
find $BACKUP_DIR -name "*.gz" -mtime +7 -delete
  1. 给脚本添加执行权限:
chmod +x backup_mysql.sh
  1. 添加定时任务:
crontab -e

# 添加数据库备份任务
0 2 * * * /path/to/backup_mysql.sh

实施效果

  • 数据库每天自动备份,确保数据安全
  • 自动删除旧备份文件,避免磁盘空间浪费

案例3:网站访问统计

场景描述:需要每小时统计网站访问量并生成报告。

解决方案

  1. 创建统计脚本 website_stats.sh
#!/bin/bash

# 日志文件路径
LOG_FILE="/var/log/nginx/access.log"

# 统计结果目录
STATS_DIR="/var/www/stats"

# 创建统计结果目录
mkdir -p $STATS_DIR

# 时间戳
TIMESTAMP=$(date +"%Y%m%d_%H00")

# 统计访问量
VISITS=$(grep "$(date +"%d/%b/%Y:%H")" $LOG_FILE | wc -l)

# 统计独立IP
UNIQUE_IPS=$(grep "$(date +"%d/%b/%Y:%H")" $LOG_FILE | awk '{print $1}' | sort | uniq | wc -l)

# 生成报告
echo "时间: $(date +"%Y-%m-%d %H:00")" > "$STATS_DIR/stats_$TIMESTAMP.txt"
echo "访问量: $VISITS" >> "$STATS_DIR/stats_$TIMESTAMP.txt"
echo "独立IP: $UNIQUE_IPS" >> "$STATS_DIR/stats_$TIMESTAMP.txt"
  1. 给脚本添加执行权限:
chmod +x website_stats.sh
  1. 添加定时任务:
crontab -e

# 添加网站统计任务
0 * * * * /path/to/website_stats.sh

实施效果

  • 每小时自动生成网站访问统计报告
  • 为网站运营提供数据支持

课后练习

  1. 创建一个定时任务,每天早上6点自动更新系统时间
  2. 配置一个定时任务,每周日晚上10点清理系统临时文件
  3. 编写一个脚本,监控系统磁盘使用率,当使用率超过80%时发送告警邮件,并设置为每小时执行一次
  4. 配置一个定时任务,每月1日自动生成系统状态报告,包括CPU、内存、磁盘和网络使用情况
  5. 学习如何使用anacron命令,了解它与cron的区别和适用场景

总结

本集详细介绍了Linux系统中Cron定时任务的配置和管理,包括Cron语法结构、配置文件编辑、任务管理和日志查看等核心知识点,并通过系统日志轮转、数据库备份和网站访问统计三个实用案例展示了Cron的应用价值。掌握Cron定时任务的使用方法,是实现系统自动化运维的基础技能,能够帮助你减少重复性工作,提高运维效率。

« 上一篇 自动化运维概述 下一篇 » Ansible 基础