【Shell實戰】定期清理日志文件的shell腳本


功能描述:清理/var/log/路徑下的messages歷史日志文件(messages-date),但不清理messages文件本身

依賴要求:服務器上安裝了bc模塊

  1 # clean_logs.sh
  2 #!/bin/bash
  3 
  4 # ==========================================
  5 # 功能:清理/var/log/路徑下的messages歷史日志文件(messages-date),但不清理messages文件本身
  6 # 方法:配合crontab作為定時任務每天執行
  7 # 返回:無
  8 # 警告:禁止直接刪除/var/log/messages文件
  9 # 日期:2018-04-23
 10 #  By:HackHan
 11 # 其他:無
 12 # ==========================================
 13 
 14 # 創建保存歷史日志清除記錄的文件/opt/cleanlogs/clean_log.log
 15 createLogFile()
 16 {
 17         targetDir=$1
 18         targetFile=$2
 19 
 20         if [ ! -d $targetDir ];then
 21                 mkdir -p $targetDir
 22         fi
 23 
 24         if [ ! -f $targetFile ];then
 25                 touch $targetFile
 26         fi
 27 }
 28 
 29 # 將信息寫入日志文件中
 30 logToFile()
 31 {
 32         msg=$1
 33         targetFile=$2
 34         echo $msg >> $targetFile
 35 }
 36 
 37 # 獲取根目錄磁盤使用率和剩余可用空間大小,以數組形式返回
 38 getRootDirUsageRate()
 39 {
 40         usagepcent=`df / -h | awk '$6=="/"{sub("%","",$5);print $5}'`
 41         availDisk=`df / -h | awk '$6=="/"{print $4}'`
 42         array=($usagepcent $availDisk)
 43         echo ${array[*]}
 44 }
 45 
 46 # 根據輸入的實際磁盤使用率、實際可用大小、使用率閾值、預期可用磁盤空間閾值判斷是否符合要求
 47 # 返回1表示符合要求,返回0表示不符合要求
 48 isDiskUsageOK()
 49 {
 50         # 實際使用率,去掉%后的數字
 51         usagepcent=$1
 52         # 實際可用磁盤空間,單位可能是K/M/G
 53         availDisk=$2
 54         # 使用率閾值,去掉%后的數字
 55         threshHoldPcent=$3
 56         # 可用磁盤空間閾值,無單位(表示G)
 57         threshHoldAvailDisk=$4
 58 
 59         if [ ${availDisk:0-1} = "g" -o ${availDisk:0-1} = "G" ]
 60         then
 61                 availDiskNoUnit=`echo $availDisk|awk '{sub(/.$/,"")}1'`
 62 
 63                 if [ `echo "$usagepcent > $threshHoldPcent" | bc` -eq 1 ] || [ `echo "$availDiskNoUnit < $threshHoldAvailDisk" | bc` -eq 1 ]
 64                 then
 65                         echo "0"
 66                 else
 67                         echo "1"
 68                 fi
 69 
 70         else
 71                 echo "0"
 72         fi
 73 
 74 }
 75 
 76 # 生成的日志目錄
 77 targetDir="/opt/cleanlogs/"
 78 # 生成的日志文件
 79 targetFile="${targetDir}clean_log.log"
 80 # 待刪除文件所在路徑
 81 targetLogDir="/opt/shell/logs/"
 82 # targetLogDir="/var/log/"
 83 
 84 # 可用磁盤空間閾值,單位默認為G
 85 availDiskThresh=10
 86 # 磁盤使用率,單位默認為%
 87 diskUsagePcent=90
 88 
 89 
 90 createLogFile $targetDir $targetFile
 91 
 92 result=(`getRootDirUsageRate`)
 93 
 94 beginCleanTime=`date '+%Y-%m-%d %H:%M:%S'`
 95 
 96 logToFile "===========================================" $targetFile
 97 logToFile "[***] Scanning time : ${beginCleanTime}" $targetFile
 98 logToFile "/ Disk info: Avail:${result[1]}      Use%:${result[0]}%" $targetFile
 99 logToFile "-------------------------------------------" $targetFile
100 
101 
102 
103 isOK=`isDiskUsageOK ${result[0]} ${result[1]} $diskUsagePcent $availDiskThresh`
104 
105 if [ $isOK = "0" ]
106 then
107 
108         logToFile "[+] Starting to clean logs ..." $targetFile
109 
110         for item in `ls ${targetLogDir}messages-*`;do
111                 #rm -f $item
112                 echo $item
113                 logToFile $item $targetFile
114         done
115 
116         logToFile "[-] Ended cleaning logs !" $targetFile
117 fi
118 
119 endCleanTime=`date '+%Y-%m-%d %H:%M:%S'`
120 
121 logToFile "[***] Ended time: ${endCleanTime}" $targetFile
122 
123 logToFile "===========================================" $targetFile
124 logToFile "" $targetFile

要實現定時執行,需要創建crontab計划。例如,我們想每隔1個小時執行該日志清除程序,假設該可執行文件存放路徑為/opt/shellutils/clean_logs.sh,那么創建crontab如下:

# crontab -e
* */1 * * * /opt/shellutils/clean_logs.sh >> /opt/cleanlogs/clean_log.log 2>&1

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM