2014-10-22 25 views
0
## 20141017 
## run as a cron script every 5 minutes 
## NB: Filesystem mounted on /u01 periodically exceeds 80% 
## 
#!/bin/bash 

fs=u01 

function deletion() { 
     pushd ~ > /dev/null 
     largedir=`du -k /u01 | sort -rn | head -n2 | awk '{print $2}' | grep -v "^/u01$"` 
     echo $largedir 
     rm -rf $largedir 
     popd > /dev/null 
} 

usage=`df -h | awk '$1 ~/dev\/sdc1/' | awk '{print $5}' | sed 's/%//g'` 
while [ $usage -gt "40" ] 
do 
     echo "Filesystem $fs has currently reached $usage% usage." 
     echo "Deleting files.." 
     deletion 
done 

假設FS使用率是41%,並且largedir的大小是13G。如果我允許刪除不間斷地運行,那麼FS的使用率可能會下降到1%;當我運行deletion()時,我希望程序能夠同時檢查使用情況,一旦使用量下降到40%以下,就必須退出。 我的方法正確嗎?或者從某種程度上更容易從最小的目錄中刪除目錄 - >通過尾巴而不是頭部最大化目錄?是否有可能擺脫基於條件執行的bash命令?

+0

'awk | awk'和'awk | grep'管道有難聞的氣味。請記住,Awk是'grep'的超集,你通常可以將這些重構爲一個Awk腳本。 'du -k/01 | sort -rn | awk'!/^\/u01 $/{print $ 2} NR == 2 {exit(0)}''和'df -h | awk'$ 1〜/ dev \/sdc1/{sub(/%/,「」);打印$ 5}'' – tripleee 2014-10-22 08:09:58

+0

哦,我不知道那個......但是如上所述使用不同的模式匹配機制是不好的? – ams 2014-10-25 22:34:56

+1

難以閱讀和維護,浪費,所以不是最好的做法;但另一方面,無論如何在不浪費生命的情況下完成工作在事物的宏偉計劃中是可以接受的。 – tripleee 2014-10-26 06:31:05

回答

0

在您的while循環中,您可能必須在運行刪除後重新計算使用情況。

如果您不想一次刪除整個目錄,並有可能讓您回到1%,那麼查找/刪除單個文件並檢查每次刪除後df是否低於40%。

否則,我認爲它可能是好的。

+0

沒問題,一旦刪除()運行,它將刪除文件系統/ u01下的最大目錄,即/ u01/app。我的問題是 - 是否有辦法在檢查FS使用情況時中斷刪除過程? – ams 2014-10-22 02:14:13

+1

然後不要刪除整個目錄 - 搜索/ u01目錄中的文件並刪除文件。使用find獲取文件列表,循環遍歷文件列表並刪除文件 - 刪除文件後,檢查df是否<40%。如果df低於40%,請退出循環。這可能會起作用。 :) – Anthony 2014-10-22 02:19:03

+0

是啊似乎更好,歡呼聲。 – ams 2014-10-25 22:33:30

相關問題