先說下背景:我們線上用的squid,根據經驗值如果長時間執行則快取目錄下的swap.state會慢慢變大,一旦超過60m,squid的效能就會急劇下降,因此需要定時去清理大於60m的swap.state檔案。
由此引出需求,查詢cache目錄下的所有大於60m的swap.state檔案並清除,即:
1.查詢cache目錄下的所有swap.state檔案
2.判斷是否大於60m
3.大於60m則清空
相關squid配置如下:
cache_dir coss /data/cache1/coss 120000 max-size=1000000 block-size=4096 membufs=100 overwrite-percent=100
cache_dir aufs /data/cache1 30000 128 128 min-size=1000000
cache_dir coss /data/cache2/coss 180000 max-size=1000000 block-size=4096 membufs=100 overwrite-percent=100
cache_dir aufs /data/cache2 50000 128 128 min-size=1000000
cache_dir coss /data/cache3/coss 200000 max-size=1000000 block-size=4096 membufs=100 overwrite-percent=100
cache_dir aufs /data/cache3 50000 128 128 min-size=1000000
cache_dir coss /data/cache4/coss 200000 max-size=1000000 block-size=4096 membufs=100 overwrite-percent=100
cache_dir aufs /data/cache4 50000 128 128 min-size=1000000
cache_dir coss /data/cache5/coss 200000 max-size=1000000 block-size=4096 membufs=100 overwrite-percent=100
cache_dir aufs /data/cache5 50000 128 128 min-size=1000000
cache_dir coss /data/cache6/coss 200000 max-size=1000000 block-size=4096 membufs=100 overwrite-percent=100
這裡稍微說下,由於我們配置了coss,所有swap.state主要是在coss目錄下,同時我們採用了多程序squid,因此coss目錄下存在squid1-squid6等目錄。
第一想到的則是常用的du -sh命令: du -sh /data/cache*/coss/squid*/swap.state ,輸入如下:
[root@crn-jz-2-36x ~]# du -sh /data/cache*/coss/squid*/swap.state 2.7m /data/cache1/coss/squid1/swap.state
270k /data/cache1/coss/squid2/swap.state
2.7m /data/cache1/coss/squid3/swap.state
2.7m /data/cache1/coss/squid4/swap.state
53m /data/cache1/coss/squid5/swap.state
35m /data/cache1/coss/squid6/swap.state
5.6m /data/cache2/coss/squid3/swap.state
4.6m /data/cache2/coss/squid4/swap.state
122m /data/cache2/coss/squid5/swap.state
4.4m /data/cache3/coss/squid4/swap.state
97m /data/cache3/coss/squid5/swap.state
75m /data/cache3/coss/squid6/swap.state
5.4m /data/cache4/coss/squid1/swap.state
74m /data/cache4/coss/squid6/swap.state
…可以發現,/data/cache4/coss/squid6/swap.state 等大於60m的swap.state為我們需要清理的目標。
當時就很自然的採用如下方案去實現:
du -sh /data/cache*/coss/squid*/swap.state | awk 『 『 | awk -f』m』 『 『
思路如下:使用du -sh 查詢大於swap.state的大小,同時使用awk 過濾第乙個字段,接著為了過濾掉m、只保留數字,再次使用awk 制定」m」作為分界符過濾出檔案大小。
輸入如下:
270k
2.72.7
5335
5.64.6
1224.4
9775
5.474
可以看出du -sh這種方案的缺點,du -sh 的 輸入會自動轉換單位,k、m、g,只過濾m會導致部分檔案大小無法正常獲取,例如第乙個的270k。同時使用了多個管道較為繁瑣,
且管道過濾之後的只有檔案大小,相對應的檔名丟失,後續的處理較麻煩,當然也可以使用陣列等解決。故放棄此方案。
問了個朋友有沒有好點的方法去處理,他提示我說不要使用帶單位的輸出,直接ls -l 的輸出就可以作為相應的資料來源。ls -l輸出的結果以位元組為單位,簡單,容易處理。
這裡同時考慮到第乙個方案的缺點,因此加了兩個臨時變數去儲存相應的檔名、檔案大小。附上最後的方案:
ls -l /data/cache*/coss/squid*/swap.state | while read i; do size=`echo $i | awk 『 』`; file=`echo $i | awk 『 』`; if [ $size -gt 61865984 ] ; then echo >$file ; fi;done
61865984 位元組換成成m單位為60m,這裡判斷是否大於60m,大於則使用echo 語句將對應檔案置空。
將單行shell整理成可讀性較強的指令碼:
#! /bin/bash
ls -l /data/cache*/coss/squid*/swap.state | while read i;
dosize=`echo $i | awk 『 』`; file=`echo $i | awk 『 』`;
#here the 61865984 byte is equal to 60m
if [ $size -gt 61865984 ] ;
then
echo $file; echo $size
#clean it
echo >$file
fidone
好吧,其實這篇部落格最主要的內容就是我犯了個很傻很天真的錯誤,採用du -sh這種帶自動單位換成的命令去處理,麻煩多多。有時候還是簡單的ls 好啊。
後續的引申可以再將次腳步稍微整理下,加上簡單的清理日誌記錄,同時掛上計畫任務,這樣就可以自動去清理了。同時類似的,以後類似的需求,
均可以由此指令碼簡單修改而實現。
自動清理超過指定大小的檔案 shell指令碼
使用du命令實現 生成幾個測試檔案 root localhost cache dd if dev zero of testfile1 bs 1m count 50 50 0 records in 50 0 records out 52428800 bytes 52 mb copied,0.14518...
Linux下自動清理超過指定大小檔案
掃瞄某個目錄下的檔案,發現超過指定大小即清空 1 掃瞄目錄下的檔案 2 判斷檔案大小 3 清空大於指定檔案的內容 以byte為單位顯示檔案大小,然後和20m大小做對比.20m換算成位元組為20971520這裡判斷是否大於20m,大於則使用echo 語句將對應檔案置空 20m 20 1024 1024...
定時清理檔案shell指令碼
乙個測試機上部署多個應用,總是經常出現磁碟空間已滿,不能部署應用的情況,所以寫了個小指令碼,用於定時清理日誌,避免出現這種情況。1 如果是清理固定路徑下的檔案,可以直接用命令方式。命令方式 1 編寫命令 find logs name catalina.out log and mtime 7 測試方法...