由於線上業務用的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