在 Linux 中,定时任务(cron)

在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发送冗余邮件。

注意事项

  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丢弃,或重定向到日志文件便于排查。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值