我們在處理磁碟報警的時候遇到了哪些問題?

2021-10-02 06:53:21 字數 3168 閱讀 7714

磁碟報警可以說是運維工程師經常碰到的一類問題了,起初,我們收到低頻的磁碟報警的時候選擇手工清理或者寫一些簡單的指令碼來應付了事,隨著業務日誌的增長,出現了越來越多的磁碟報警,也出現了不同版本的磁碟清理指令碼,但是仍然沒有明顯的減少磁碟報警對運維人員的干擾, 於是開始了乙個算是較為通用的磁碟清理指令碼的編寫。

在寫指令碼的過程中考慮了幾個問題

1.要清理哪些日誌,應該設計成可配置的

2.清理的許可權要控制得當,不能誤刪檔案

3.日誌要保留多長時間也應該設計成可配置的

4.刪除了什麼檔案應該被記錄下來

5.要刪除的檔案應該判斷fd是否被關閉,否則刪除掉並不能釋放磁碟空間

6.磁碟應該在使用率高於60%再清理

於是開始寫了第一版清理指令碼並且快速的上線了,沒過幾天,發現仍然有磁碟報警,登上機器發現package目錄下存放了10個版本的歷史包,一共佔了近20多個g, 好, 加上這個目錄的清理邏輯,只保留最新日期的3個包, 磁碟空間降下來了。

平穩的度過一段時間後,又發生了幾次磁碟報警, 排查發現,我們配置的日誌保留日期是7天,但業務日誌在2天前突然猛增,直接寫滿了磁碟,那現在要解決的事情就是怎麼避免磁碟在短時間內被快速寫滿, 解決方法是每次執行都判斷一下磁碟空間的使用率, 在突破60%後,仍然增長到大於80%,就不再按照保留期限刪除,開始刪除5分鐘前的資料,直到磁碟降到低於80%

附上指令碼:

#!/bin/bash

#set -x

lockfile=$(dirname $0)/.hd_delete.lock

config=$(dirname $0)/hd_delete.config

logfile=$(dirname $0)/hd_delete.log

timestamp=$(date 「+%y-%m-%d %h:%m:%s」)

tempconfig=$(dirname $0)/.hd_delete.temp

type lsof || yum -y install lsof

safedelete()

test -f $filename || return

lsof $filename >/dev/null 2>&1 && ||

echo 「$timestamp – $filename deleted by hd_delete cron 」 >> $logfile

}cleanup()

min=$

find $path -type f -mmin +$min | while read logfile

dosafedelete $logfile

done

}cleanbigfile()

max=$

find $path -type f -size +$g | while read logfile

dosafedelete $logfile

done

}exportusage() 』 | sed 『s/%//g』)

echo $res

}rootusage() 』 | sed 『s/%//g』)

echo $res

}packageclean() 『-『 3)

rd=$(find /export/packages/*/*/ -maxdepth 0 -type d| xargs ls -dtr|head -n 「$rc」)

for x in $

do[[ x」$x」 != x」/」 ]] || return 1

[[ x」$x」 != x」/export」 && x」$x」 != x」/export/」 ]] || return 1

[[ x」$x」 != x」/export/servers」 && x」/export/servers/」 ]] || return 1

/usr/bin/rm -rf $x

echo 「$timestamp – $x deleted by hd_delete cron 」 >> $logfile

done

}cataclean()

validateconfig()

main() }end' $tempconfig) n=$(awk 'begin}end』 $tempconfig)

[[ x」$m」 != x」」 && x」$n」 != x」」 ]] || return 1

for ((i=m;i>=n;i–))

dodiskusage=$(exportusage)

diskusage=$

rootusage=$(rootusage)

rootusage=$

(( diskusage > 60 )) || (( rootusage > 60 )) || break

while read line

dovalidateconfig $line || continue

p=$(echo $line | awk 『』)

k=$(echo $line | awk 『』)

k=$(expr $ 『*』 60)

(( i>=k )) && cleanup $p $k

cleanbigfile $p 1

done < $tempconfig done for (( i=n;i>=1;i– ))

dodiskusage=$(exportusage)

diskusage=$

rootusage=$(rootusage)

rootusage=$

(( diskusage > 80 )) || (( rootusage > 80 )) || break

while read line

dovalidateconfig $line || continue

p=$(echo $line | awk 『』)

cleanup $p 5

done < $tempconfig done } test ! -f $lockfile || (echo "hd_delete is running or lock file not released" ; exit 1) [ `whoami` != 'root' ] || (echo "[warn] don't use root privilege for auto_delete "; exit 1) touch $lockfile main packageclean cataclean /bin/rm -f $lockfile

mysql 在正式使用的時候,遇到了無法訪問的問題

整個程式的配置,包括 都沒有問題,但是當訪問 首頁的時候就出現500錯,後來檢視tomcat日誌,發現某個表不存在,但表是剛剛從外網dump下來的新庫,怎麼會不存在了。然後我找db人員看下是否是表出現了問題,db人員告訴我資料庫是最新的並沒有問題,而且提示我有可能是大小寫敏感的問題,我檢視自己建資料...

opengl中繪製文字的時候遇到了亂碼問題

在工程中用opengl會座標系之後需要進行相應的標註,開始使用的 如下所示 wglusefontbitmaps wglgetcurrentdc 0,256,1000 將asii碼字元裝入顯示列表 gllistbase 1000 glrasterpos3f 0.525 m scale,glheight...

今天在發布IIS站點的時候遇到了一些問題

1 http 錯誤 500.23 internal server error 分析 一般5xx的錯誤都是伺服器的問題,這裡把應用程式池改為經典模式。2 這個問題一般是framework版本太低了,在程式池這裡要選擇4.0 3 這裡還要註冊一下framework4.0,因為版本太低了,還會報乙個錯誤。...