【自动化运维】告别手动搬运!编写Shell脚本自动备份与清理日志

简介: 本文介绍如何通过Shell脚本结合Crontab,实现服务器日志的自动备份与清理。每天凌晨2点自动压缩昨日日志并保存至备份目录,同时删除7天前的旧备份,防止磁盘占满。脚本具备目录创建、压缩打包、错误提示和日志记录功能,操作安全可靠,适合Linux运维新手实践自动化管理。

前言

在服务器运维中,日志文件(Logs) 是个让人又爱又恨的东西。 爱它是因为出了Bug全靠它排查;恨它是因为它每天疯狂增长,如果不定期清理,很快就会把服务器磁盘塞满(Disk Full),导致服务宕机。

很多新手是等到磁盘满了,才急匆匆地上去手动删除。今天,我们用一个简单的 Shell 脚本,配合 Linux 的定时任务,把“备份日志”和“清理旧日志”这件事彻底自动化。

场景描述

假设我们的应用日志放在 /data/logs/myapp/ 目录下。我们的目标:

  1. 每天凌晨2点,把昨天的日志打包压缩。
  2. 将压缩包移动到备份目录 /data/backup/
  3. 自动删除 7 天前的备份文件,节省空间。

第一步:编写脚本 (backup_logs.sh)

首先,创建一个脚本文件:

Bash

vim backup_logs.sh

然后,复制以下代码。我已经给每一步都加了详细的中文注释,确保你能看懂。

Bash

#!/bin/bash
# ================= 配置区域 =================
# 日志源目录
SOURCE_DIR="/data/logs/myapp"
# 备份存放目录
BACKUP_DIR="/data/backup/myapp"
# 获取当前日期,格式如:20231027
DATE=$(date +%Y%m%d)
# ===========================================
# 1. 判断备份目录是否存在,不存在则创建
if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
    echo "创建备份目录: $BACKUP_DIR"
fi
# 2. 开始打包压缩
# 将源目录下的所有 .log 文件打包成 log_日期.tar.gz
echo "开始备份..."
tar -czf "$BACKUP_DIR/log_$DATE.tar.gz" "$SOURCE_DIR"/*.log
# 检查上一条命令是否执行成功
if [ $? -eq 0 ]; then
    echo "备份成功:$BACKUP_DIR/log_$DATE.tar.gz"
else
    echo "备份失败!请检查目录或权限。"
    exit 1
fi
# 3. 清理旧日志
# 找到备份目录下,超过7天(+7)且后缀为 .tar.gz 的文件,并执行删除
find "$BACKUP_DIR" -type f -mtime +7 -name "*.tar.gz" -exec rm -rf {} \;
echo "已清理7天前的旧备份文件。"
echo "任务完成。"

第二步:赋予执行权限

还记得上一篇讲的 chmod 吗?刚写好的脚本是没有执行权限的。

Bash

# 赋予脚本执行权限
chmod +x backup_logs.sh

建议: 在正式上定时任务前,先手动运行一次脚本 ./backup_logs.sh,看看有没有报错,备份目录下有没有生成压缩文件。

第三步:设置定时任务 (Crontab)

脚本写好了,我们不能每天半夜爬起来手动点一下。Linux 自带的 Crontab 是最好的定时器。

  1. 打开定时任务编辑器:
    Bash
crontab -e
  1. 在编辑器末尾添加一行(按 i 进入编辑模式):Bash
# 每天凌晨 02:00 执行备份脚本
0 2 * * * /root/scripts/backup_logs.sh >> /tmp/backup.log 2>&1
  1. 这行代码的含义:
  • 0 2 * * *:分 时 日 月 周。意思是每天的 02:00 执行。
  • /root/scripts/backup_logs.sh:脚本的绝对路径(注意:一定要用绝对路径!)。
  • >> /tmp/backup.log 2>&1:把脚本执行过程中的输出日志(包括正确输出和错误报错)都记录到 /tmp/backup.log 里,方便后续排查脚本是否执行成功。
  1. 保存退出(按 Esc,输入 :wq)。

第四步:验证定时任务

如何确认定时任务是否生效了?

Bash

# 查看当前用户的定时任务列表
crontab -l
# 查看系统定时任务日志(查看是否有执行记录)
tail -f /var/log/cron

总结

通过这个简单的脚本,我们实现了一个闭环的自动化运维流程:自动备份 -> 自动压缩 -> 自动清理过期文件

虽然现在的云服务提供了很多现成的日志服务(如阿里云SLS),但掌握这种基础的 Shell 脚本编写能力,能让你在处理一些临时性、定制化的任务时游刃有余。

小作业:尝试修改脚本,将“保留7天”改为“保留30天”,你知道该改哪一行吗?

相关文章
|
25天前
|
安全 Linux Shell
【Linux进阶】拒绝Permission denied!彻底搞懂chmod与chown文件权限
本文深入解析Linux权限管理核心命令`chmod`与`chown`,教你读懂`ls -l`输出,掌握数字权限(如755、644)的含义与应用场景,理解属主与属组的作用,强调最小权限原则,拒绝滥用`chmod 777`,保障服务器安全。
|
25天前
|
Java Linux 开发工具
Linux
本文介绍如何将一个简单的SpringBoot应用打包并部署到Linux服务器。包括项目搭建、JAR包打包、JDK安装配置、应用上传与启动,以及通过心跳接口验证服务是否正常运行的完整流程,适用于Java应用的Linux部署入门学习。
|
Ubuntu Python 文字识别
OCRmypdf安装部署深入详解
OCRmyPDF使用最好的可用开源OCR引擎Tesseract执行OCR。 OCRmyPDF是一个Python 3包,将OCR图层处理结果添加到PDF。 OCRmyPDF是功能最丰富且经过彻底测试的OCR PDF转换工具。
3259 0
OCRmypdf安装部署深入详解
|
25天前
|
运维 监控 Java
【Linux基础】开发日常:盘点后端开发中最高频使用的10个Linux命令
本文为后端开发者整理了日常运维中最常用的10个Linux命令,涵盖文件查看、日志监控、进程管理、网络排查等核心场景。从`ls`、`cd`到`tail`、`grep`,再到`ps`、`netstat`、`top`等,结合实际案例讲解高频用法,助你高效应对服务器操作,提升开发效率。
|
25天前
|
Kubernetes IDE 应用服务中间件
2.部署篇(开发部署)
本文介绍如何将SpringCloud应用部署到Kubernetes云端,基于EDAS实现快速上云。涵盖集群导入、应用初始化及通过IDE插件高效部署,助力开发者提升发布效率。
|
25天前
|
人工智能 NoSQL 前端开发
面试真题
汇总多套AI与后端技术面试题,涵盖RAG、微服务、JVM、分布式锁、MySQL优化、大模型部署等核心技术点,深入考察候选人项目经验、系统设计能力及对AI工程化的理解。
88 0
|
6月前
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的口腔牙科预约管理系统
基于Python+Vue开发的口腔牙科预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的口腔牙科诊所预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
1589 4
|
Java
Unable to find @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest
Unable to find @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest
378 0

热门文章

最新文章