工作中有多套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