在 Linux 中,定时任务(cron)

在Linux中,定时任务(cron)的灵活性在于通过时间字段的组合和命令的搭配,可适应多种场景。以下是一个包含不同典型场景的crontab示例,涵盖了周期性执行、特定时间点执行、结合脚本、输出处理等常见需求:

示例crontab配置(通过crontab -e编辑)

bash 复制代码
# 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. 每日数据库备份
bash 复制代码
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. 每周日志清理
bash 复制代码
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. 每月生成统计报告并发送邮件
bash 复制代码
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. 每小时检查并重启服务
bash 复制代码
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. 工作日执行数据同步
bash 复制代码
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发送冗余邮件。

注意事项

  1. 路径问题 :cron的环境变量精简,命令和脚本需用绝对路径(如/usr/bin/mysqldump而非mysqldump)。
  2. 权限问题 :执行的脚本需有可执行权限(chmod +x 脚本名),且cron用户(如root)需有操作目标文件/目录的权限。
  3. 时间格式 :周和日同时设置时,满足其一即执行(如0 0 1 1 0表示"1月1日"或"周日",若1月1日是周日则只执行一次)。
  4. 输出处理 :避免任务输出无意义信息,可通过> /dev/null 2>&1丢弃,或重定向到日志文件便于排查。

通过上述组合,可覆盖日常运维中备份、清理、监控、报告等大部分定时任务需求。

相关推荐
BestOrNothing_20152 分钟前
(1)双系统中Ubuntu22.04启动盘制作与启动盘恢复全过程
linux·ubuntu·双系统·启动盘制作·启动盘恢复
AI成长日志7 分钟前
【实用工具教程】Linux常用命令速查与实战场景:文件操作、进程管理与网络调试高频命令解析
linux·php
落叶花开又一年12 分钟前
检验检测机构资质认定远程评审工作程序
linux·运维·服务器
wanhengidc12 分钟前
《三国志异闻录》搬砖新游戏 云手机
运维·服务器·数据库·游戏·智能手机
idolao19 分钟前
CentOS 7 安装 jdk-7u25-linux-x64.tar.gz 详细步骤(解压配置环境变量)
linux
i建模33 分钟前
通过命令行使用密钥登录远程SSH主机
运维·ssh
旺仔.2911 小时前
僵死进程及Linux文件操作 详解
linux·运维·服务器
IMPYLH1 小时前
Linux 的 comm 命令
linux·运维·算法
淡泊if1 小时前
1.2GB → 98MB,我的 Docker 镜像瘦身实战记录
运维·docker·容器
Sst的头号粉丝1 小时前
Docker——cgroups
运维·docker·容器