1. 苏葳的备忘录首页
  2. 操作系统

Linux下定时检测磁盘空间并删除日志的Shell脚本

redhat gcc printf

工作中有多套Linux测试环境长年运行,外联系统经常会发送一些压力测试交易,导致大量日志写满磁盘空间,随后用一般权限用户已经无法登录服务器,执行日志清理操作了。又不可能设置专职人员随时关注测试环境服务器的空间占用状况。经分析,空间占用的主要内容是应用服务产生的大量日志文件。因而决定在所有服务器上跑定时任务脚本,检测磁盘空间占用超过一个比率(比如95%)时,自动删除日志文件。

清理脚本如下:

. /home/`whoami`/.profile
def=95
cur=`df --type=xfs --output=pcent,target | grep " /$" | awk '{print $1}' | tr -d %`
pa=/home/`whoami`/logs/
#echo $pa
files=`find $pa -name "*" -type f`
#echo $files
#cur=
if [ ${cur}z == 'z' ]
then
exit
fi
if [ ${files}z == 'z' ]
then
#echo 'no files to delete,exit...'
exit
fi
if [ $cur -ge $def ]
then
echo `date +"%Y%m%d-%H%M%S"` delete...
/bin/rm $files
fi

脚本中设置触发删除的条件为磁盘空间占用超过95%。清理方式是简单暴力的删除当前用户目录(应用目录)下logs目录中所有文件,注意只删掉文件,而会保留现有目录结构。此脚本批量上传到各服务器上之后,需要在各服务器crontab里增加相应的定时任务。将如下增加crontab项的脚本和上述检测清理脚本一同上传服务器:

us=`whoami`
chmod 755 /home/$us/user/bin/cc.sh
crontab -l >/home/$us/t1
cat /home/$us/t1
echo "*/5 * * * * /home/$us/user/bin/cc.sh >>/home/$us/cc.log" >>/home/$us/t1
cat /home/$us/t1
read a1
crontab /home/$us/t1
rm /home/$us/t1

脚本里调用的cc.sh为检测清理脚本。可看到此脚本增加crontab项的方法是,先导出一份现有crontab,然后把新定时任务添加到现有crontab导出文件后面,随后用crontab加载新的全量定时任务内容。将此脚本在所有服务器上批量执行,即可把检测清理脚本添加进crontab任务,定时执行。

上述脚本可能存在一个问题:crontab里设置每隔5分钟检测一次空间,若日志爆发性增长,有可能在5分钟之内就消耗完剩下5%的空间,导致清理机制失效。所以这个定时时间间隔和触发百分比值,需要根据实际情况调整。

另外在实际运行中还发现一个潜在缺陷。logs目录下文件数量较多时,直接rm文件列表的方式会失败。类似于如下报错:

testhaha:/home/haha$>/bin/rm `find /home/haha/logs/ -name "*" -type f`
-ksh: /bin/rm: /bin/rm: cannot execute [Argument list too long]

此时在脚本中可用另一种更可靠的方式来删除所有日志文件:

find /home/haha/logs/ -name "*" -type f |xargs /bin/rm

以上命令及脚本均在RHEL 7.3和ksh下执行。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/2225.html

发表评论

邮箱地址不会被公开。 必填项已用*标注