用shell脚本巧解日志文件塞满磁盘导致系统挂起的困惑

2023-11-12 01:30

本文主要是介绍用shell脚本巧解日志文件塞满磁盘导致系统挂起的困惑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:田逸(formyz)

出事了,十万火急

一帮可爱的程序员,写的程序没有规划,程序、代码与日志一锅粥,而且都在某云的系统盘,不光生成的文件多,而且不做处理。有一天,来了个十万火急的求救,告知弹性伸缩功能被触发,自动增加云主机到设定的最高值,但系统仍然不能访问,需要我马上解决。登上任意云主机系统,查进程、查负载、再查磁盘使用率,我的天,系统只有一个分区,大小为40G,使用率接近100%。没有空闲空间,系统往/var/log及/tmp里无法写入数据,导致服务不响应,负载均衡监控发现云主机整体异常,认为是容量不够,就自动扩容,但扩容出来的云主机,其磁盘空间也一样是塞满了的,所以….

 

故障排查及临时措施

因为磁盘塞满了,虽然登录进去了系统,但很多操作不能进行,最后在/tmp目录下删掉一些下文件,稍微给系统腾出了一些空间,才有幸把与业务相关的服务停止,用df配合du看看是什么文件占据了这么多的空间。

 

好家伙,居然有单个日志文件超过20G的,虽然日志文件多且大,据猜测,这些程序员可能压根都没有去看这些日志,也不知道产生日志有什么意义(不看不处理等于零)。不管三七二十一,先干掉几个大的文件,让服务恢复。

终极办法

给日志分配单独的磁盘空间,并按约定的统一格式命名日志,每天夜里,做一次日志切割。具体做法是复制前一天的日志到另外一个位置,接着清空原来的日志;在归档日志目录,保留最近15天来的所有日志。

有人问,直接清空服务,会丢失少部分日志记录,为啥不停服务,等日志归档完再重启?这个是因为需要重启的服务太多,数十个,可能存在自动启动不了的风险,并且丢失少许日志是他们可以接受的。

需求明确以后,撰写了一个Shell脚本,内容如下:

[root@s176 logs]# more /usr/bin/logs_arch.sh

#!/bin/bashsource /etc/profilecd /logslist_src_logs=`ls -f  | grep log$`for i in  $list_src_logsdo#echo $icp  $i arch_logs/$i.`date +%Y-%m-%d`echo ""> $isleep 1doneif [[ $(ls -A arch_logs) ]]thenfind arch_logs/*  -mtime 15 -deleteelseecho "dir is empty"fiexit 0

先手动执行此脚本,验证其正确性及有效性,确保可以到达目的以后,再将其加入到crontab计划任务中。

第二天,查验计划任务完成情况,经多次验证,最终达到系统盘及归档盘不被塞满的目标。

这篇关于用shell脚本巧解日志文件塞满磁盘导致系统挂起的困惑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/394170

相关文章

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

SpringBoot如何使用TraceId日志链路追踪

《SpringBoot如何使用TraceId日志链路追踪》文章介绍了如何使用TraceId进行日志链路追踪,通过在日志中添加TraceId关键字,可以将同一次业务调用链上的日志串起来,本文通过实例代码... 目录项目场景:实现步骤1、pom.XML 依赖2、整合logback,打印日志,logback-sp

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

python写个唤醒睡眠电脑的脚本

《python写个唤醒睡眠电脑的脚本》这篇文章主要为大家详细介绍了如何使用python写个唤醒睡眠电脑的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 环境:win10python3.12问题描述:怎么用python写个唤醒睡眠电脑的脚本?解决方案:1.唤醒处于睡眠状

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1