【自动化运维】告别手动搬运!编写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天”,你知道该改哪一行吗?

相关文章
|
2月前
|
安全 Linux Shell
【Linux进阶】拒绝Permission denied!彻底搞懂chmod与chown文件权限
本文深入解析Linux权限管理核心命令`chmod`与`chown`,教你读懂`ls -l`输出,掌握数字权限(如755、644)的含义与应用场景,理解属主与属组的作用,强调最小权限原则,拒绝滥用`chmod 777`,保障服务器安全。
openvpn安装文档
openvpn通过使用公开密钥(非对称密钥,加密解密使用不同的key,一个称为Publice key,另外一个是Private key)对数据进行加密的。这种方式称为TLS加密。openvpn使用TLS加密的工作过程是,首先VPN Sevrver端和VPN Client端要有相同的CA证书,双方通过交换证书验证双方的合法性,用于决定是否建立VPN连接。然后使用对方的CA证书,把自己目前使用的数据加密方法加密后发送给对方,由于使用的是对方CA证书加密,所以只有对方CA证书对应的Private key才能解密该数据,这样就保证了此密钥的安全性,并且此密钥是定期改变的。
2932 0
|
2月前
|
Kubernetes IDE 应用服务中间件
2.部署篇(开发部署)
本文介绍如何将SpringCloud应用部署到Kubernetes云端,基于EDAS实现快速上云。涵盖集群导入、应用初始化及通过IDE插件高效部署,助力开发者提升发布效率。
|
2月前
|
运维 监控 Java
【Linux基础】开发日常:盘点后端开发中最高频使用的10个Linux命令
本文为后端开发者整理了日常运维中最常用的10个Linux命令,涵盖文件查看、日志监控、进程管理、网络排查等核心场景。从`ls`、`cd`到`tail`、`grep`,再到`ps`、`netstat`、`top`等,结合实际案例讲解高频用法,助你高效应对服务器操作,提升开发效率。
|
1月前
|
运维 Ubuntu 应用服务中间件
Nginx日志文件归档(手把手教你自动压缩和轮转日志)
本文介绍如何使用Linux自带的logrotate工具实现Nginx访问日志与错误日志的自动轮转、压缩与归档。通过简单配置,可避免日志文件过大占用磁盘空间,提升系统稳定性。涵盖配置步骤、参数详解、测试方法及常见问题解决方案,适合运维新手快速上手,保障服务器长期稳定运行。
|
2月前
|
人工智能 NoSQL 前端开发
面试真题
汇总多套AI与后端技术面试题,涵盖RAG、微服务、JVM、分布式锁、MySQL优化、大模型部署等核心技术点,深入考察候选人项目经验、系统设计能力及对AI工程化的理解。
130 0
|
运维 监控 Linux
自动化运维的魔法:如何用Python脚本简化日常任务
【9月更文挑战第13天】在数字化时代的浪潮中,自动化运维如同一股清流,为IT团队带来了效率和灵活性的双重提升。本文将深入探讨如何通过Python脚本实现日常运维任务的自动化,从而释放双手,让重复性工作变得轻松愉快。从环境搭建到实际案例分析,我们将一步步揭开自动化运维的神秘面纱,让你的运维之路更加顺畅。
|
运维 监控 测试技术
5个常见运维场景,用这几个Python脚本就够了!
5个常见运维场景,用这几个Python脚本就够了!
546 0
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的口腔牙科预约管理系统
基于Python+Vue开发的口腔牙科预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的口腔牙科诊所预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
1619 4
|
Java
Unable to find @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest
Unable to find @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest
414 0