Linux下自動清理超過指定大小文件的方法


 

由於線上業務用的squid,根據經驗值如果長時間運行則緩存目錄下的swap.state會慢慢變大,一旦超過60M,squid的性能就會急劇下降,因此需要定時去清理大於60M的swap.state文件。由此引出需求,查找cache目錄下的所有大於60M的swap.state文件並清除,即:
1)查找cache目錄下的所有swap.state文件
2)判斷是否大於60M
3)大於60M則清空

解題思路:
以byte為單位顯示文件大小,然后和60M大小做對比. 60M換算成字節為62914560這里判斷是否大於60M,大於則使用echo 語句將對應文件置空。
60M=60*1024*1024=62914560 byte

可以使用dd命令創建一個60M的文件,測試下:

[root@kevin ~]# dd if=/dev/zero of=/mnt/test bs=1M count=60
60+0 records in
60+0 records out
62914560 bytes (63 MB) copied, 0.0492826 s, 1.3 GB/s
[root@kevin ~]# du -sh /mnt/test 
60M     /mnt/test
[root@kevin ~]# du -sh -b /mnt/test 
62914560        /mnt/test
[root@kevin ~]# ls -l /mnt/test
-rw-r--r--. 1 root root 62914560 Oct 12 14:15 /mnt/test

注意: 
如果文件是帶小數點的M單位,比如文件大小為1.3M,則換算成byte單位時,就不能直接使用1.3*1024*1024=1363148.8這樣計算了,因為這個
1.3M的大小是估算出來的M單位的大小,不是精確到的. 如果直接加-b參數換算成byte單位大小則就是精確的值了,如下:
[root@kevin logs]# du -sh catalina.out 
1.3M    catalina.out
[root@kevin logs]# du -sh -b catalina.out 
1349930 catalina.out
[root@kevin logs]# ls -l catalina.out     
-rw-r--r--. 1 root root 1349930 Oct 12 14:20 catalina.out

1) 方法一: "du -sh -b"

語法
# du [-abcDhHklmsSx][-L <符號連接>][-X <文件>][--block-size][--exclude=<目錄或文件>][--max-depth=<目錄層數>][--help][--version][目錄或文件]
 
參數說明:
-a或-all                                  #顯示目錄中個別文件的大小。
-b或-bytes                                #顯示目錄或文件大小時,以byte為單位。
-c或--total                               #除了顯示個別目錄或文件的大小外,同時也顯示所有目錄或文件的總和。
-D或--dereference-args                    #顯示指定符號連接的源文件大小。
-h或--human-readable                      #以K,M,G為單位,提高信息的可讀性。
-H或--si                                  #與-h參數相同,但是K,M,G是以1000為換算單位。
-k或--kilobytes                           #以1024 bytes為單位。
-l或--count-links                         #重復計算硬件連接的文件。
-L<符號連接>或--dereference<符號連接>        #顯示選項中所指定符號連接的源文件大小。
-m或--megabytes                           #以1MB為單位。
-s或--summarize                           #僅顯示總計。
-S或--separate-dirs                       #顯示個別目錄的大小時,並不含其子目錄的大小。
-x或--one-file-xystem                     #一開始處理時的文件系統為准,若遇上其它不同的文件系統目錄則略過。
-X<文件>或--exclude-from=<文件>            #<文件>指定目錄或文件。
--exclude=<目錄或文件>                     #略過指定的目錄或文件。
--max-depth=<目錄層數>                     #超過指定層數的目錄后,予以忽略。
--help 顯示幫助。
--version                                #顯示版本信息。
 
[root@kevin ~]# du -sh /data/cache/coss/squid*/swap.state
4M /data/cache/coss/squid1/swap.state
270k /data/cache/coss/squid2/swap.state
4M /data/cache/coss/squid3/swap.state
8M /data/cache/coss/squid4/swap.state
53M /data/cache/coss/squid5/swap.state
35M /data/cache/coss/squid6/swap.state
6M /data/cache/coss/squid7/swap.state
7M /data/cache/coss/squid8/swap.state
97M /data/cache/coss/squid9/swap.state
75M /data/cache/coss/squid10/swap.state
 
[root@kevin ~]# du -sh -b /data/cache/coss/squid*/swap.state
4194304 /data/cache/coss/squid1/swap.state
276480 /data/cache/coss/squid2/swap.state
4194304 /data/cache/coss/squid3/swap.state
8388608 /data/cache/coss/squid4/swap.state
55574528 /data/cache/coss/squid5/swap.state
36700160 /data/cache/coss/squid6/swap.state
6291456 /data/cache/coss/squid7/swap.state
7340032 /data/cache/coss/squid8/swap.state
101711872 /data/cache/coss/squid9/swap.state
78643200 /data/cache/coss/squid11/swap.state
 
使用du -sh -b查找出相應文件的大小,同時使用awk 過濾第一個字段,只保留數字
[root@kevin ~]# du -sh -b /data/cache/coss/squid*/swap.state | awk '{ print $1 }'  
4194304
276480
4194304
8388608
55574528
36700160
6291456
7340032
101711872
78643200

[root@kevin ~]# du -sh -b /data/cache/coss/squid*/swap.state | awk '{ print $2 }'  
/data/cache/coss/squid1/swap.state
/data/cache/coss/squid2/swap.state
/data/cache/coss/squid3/swap.state
/data/cache/coss/squid4/swap.state
/data/cache/coss/squid5/swap.state
/data/cache/coss/squid6/swap.state
/data/cache/coss/squid7/swap.state
/data/cache/coss/squid8/swap.state
/data/cache/coss/squid9/swap.state
/data/cache/coss/squid11/swap.state

批量處理的腳本
[root@kevin ~]# vim /root/cache_gt_60.sh
#!/bin/bash
for size in $(du -sh -b /data/cache/coss/squid*/swap.state| awk '{ print $1 }')
do
   for file in $(du -sh -b /data/cache/coss/squid*/swap.state|grep ${size}|awk '{print $2}')
   do
         if [ ${size} -gt 62914560 ];then
         echo ${file} ${size}
         echo "" > ${file}
         fi
    done
done
 
結合crontab進行定時執行
[root@kevin ~]# chmod 755 /root/cache_gt_60.sh
[root@kevin ~]# /bin/bash -x  /root/cache_gt_60.sh
[root@kevin ~]# crontab -e
0 2 * * 6 /bin/bash -x /root/cache_gt_60.sh > /dev/null 2>&1

2) 方法二: "ls -l"
ls命令是linux下用來列出目錄下的文件. 下面是關於ls的一些常規用法:

ls -a     #列出文件下所有的文件,包括以“.“開頭的隱藏文件(linux下文件隱藏文件是以.開頭的,如果存在..代表存在着父目錄)。
ls -l     #列出文件的詳細信息,如創建者,創建時間,文件的讀寫權限列表等等。
ls -F     #在每一個文件的末尾加上一個字符說明該文件的類型。"@"表示符號鏈接、"|"表示FIFOS、"/"表示目錄、"="表示套接字。
ls -s     #在每個文件的后面打印出文件的大小。  size(大小)
ls -t     #按時間進行文件的排序  Time(時間)
ls -A     #列出除了"."和".."以外的文件。
ls -R     #將目錄下所有的子目錄的文件都列出來,相當於我們編程中的“遞歸”實現
ls -L     #列出文件的鏈接名。Link(鏈接)
ls -S     #以文件的大小進行排序

ls可以結合管道符”|“來進行一下復雜的操作。比如: ls | less用於實現文件列表的分頁,ls

[root@clamav-server ~]# ls -l /data/cache/coss/squid*/swap.state
-rw-r--r--. 1 root root      4194304  Oct 3 11:52 /data/cache/coss/squid1/swap.state
-rw-r--r--. 1 root root      276480 Oct 3 12:12 /data/cache/coss/squid2/swap.state
-rw-r--r--. 1 root root      4194304 Oct 3 12:34 /data/cache/coss/squid3/swap.state
-rw-r--r--. 1 root root      8388608 Oct 3 14:06 /data/cache/coss/squid4/swap.state
-rw-r--r--. 1 root root      55574528 Oct 3 14:13 /data/cache/coss/squid5/swap.state
-rw-r--r--. 1 root root      36700160 Oct 3 15:21 /data/cache/coss/squid6/swap.state
-rw-r--r--. 1 root root      6291456 Oct 3 15:58 /data/cache/coss/squid7/swap.state
-rw-r--r--. 1 root root      7340032 Oct 3 17:12 /data/cache/coss/squid8/swap.state
-rw-r--r--. 1 root root      101711872 Oct 3 17:40 /data/cache/coss/squid9/swap.state
-rw-r--r--. 1 root root      78643200 Oct 3 19:27 /data/cache/coss/squid11/swap.state

[root@clamav-server ~]# ls -l /data/cache/coss/squid*/swap.state |awk '{print $5}'
4194304
276480
4194304
8388608
55574528
36700160
6291456
7340032
101711872
78643200
[root@clamav-server ~]# ls -l /data/cache/coss/squid*/swap.state |awk '{print $9}'
/data/cache/coss/squid1/swap.state
/data/cache/coss/squid2/swap.state
/data/cache/coss/squid3/swap.state
/data/cache/coss/squid4/swap.state
/data/cache/coss/squid5/swap.state
/data/cache/coss/squid6/swap.state
/data/cache/coss/squid7/swap.state
/data/cache/coss/squid8/swap.state
/data/cache/coss/squid9/swap.state
/data/cache/coss/squid11/swap.state

批量處理的腳本
[root@clamav-server ~]# vim /root/cache_gt_60.sh
#!/bin/bash
for size in $(ls -l /data/cache/coss/squid*/swap.state |awk '{print $5}')
do
   for file in $(ls -l /data/cache/coss/squid*/swap.state|grep $size |awk '{print $9}')
   do
         if [ ${size} -gt 62914560 ];then
         echo ${file} ${size}
         echo "" > ${file}
         fi
    done
done

結合crontab進行定時執行
[root@CRN-JZ-2-36X ~]# chmod 755 /root/cache_gt_60.sh
[root@CRN-JZ-2-36X ~]# /bin/bash -x  /root/cache_gt_60.sh
[root@CRN-JZ-2-36X ~]# crontab -e
0 2 * * 6 /bin/bash -x /root/cache_gt_60.sh > /dev/null 2>&1

3) 方法三"find -size"
-size 選項用於查找滿足指定的大小條件的文件(注意不查找目錄), +表示大於, -表示小於, 沒有+或-表示正好等於。

[root@kevin ~]# du -sh /data/cache/coss/squid*/swap.state
4M /data/cache/coss/squid1/swap.state
270k /data/cache/coss/squid2/swap.state
4M /data/cache/coss/squid3/swap.state
8M /data/cache/coss/squid4/swap.state
53M /data/cache/coss/squid5/swap.state
35M /data/cache/coss/squid6/swap.state
6M /data/cache/coss/squid7/swap.state
7M /data/cache/coss/squid8/swap.state
97M /data/cache/coss/squid9/swap.state
75M /data/cache/coss/squid10/swap.state

[root@kevin ~]# find  /data/cache/coss/squid*/swap.state -size +60M 
/data/cache/coss/squid9/swap.state
/data/cache/coss/squid10/swap.state

[root@redis-new03 ~]# for i in $(find  /data/cache/coss/squid*/swap.state -size +60M);do echo " " > $i;done 

[root@kevin ~]# du -sh /data/cache/coss/squid*/swap.state
4M /data/cache/coss/squid1/swap.state
270k /data/cache/coss/squid2/swap.state
4M /data/cache/coss/squid3/swap.state
8M /data/cache/coss/squid4/swap.state
53M /data/cache/coss/squid5/swap.state
35M /data/cache/coss/squid6/swap.state
6M /data/cache/coss/squid7/swap.state
7M /data/cache/coss/squid8/swap.state
4.0K /data/cache/coss/squid9/swap.state
4.0K /data/cache/coss/squid10/swap.state

編寫腳本
[root@kevin ~]# vim /root/cache_gt_60.sh
#!/bin/bash
for i in $(find  /data/cache/coss/squid*/swap.state -size +60M);
do 
   echo " " > $i;
done 

結合crontab進行定時執行
[root@kevin ~]# crontab -e
0 2 * * 6 /bin/bash -x /root/cache_gt_60.sh > /dev/null 2>&1


免責聲明!

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



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