shell實例利用crontab自動清除日誌

shell實例利用crontab自動清除日誌

      程序運行會產生不少的日誌,對於無用的日誌手動刪除比價麻煩,寫一個自動執行的命令是頗有必要的。html

 

 

刪除文件shell命令

 

find 對應目錄 -mtime +天數 -name "文件名" -exec rm -rf {} \;linux

 

具體的命令以下:shell

  find /mnt/tomcat/logs/ -mtime +35 -name "*.log" -exec rm -rf {} \;tomcat

 參數及說明:post

整句的做用是將 /mnt/tomcat/logs/目錄下全部30天前帶".log"的文件刪除。測試

find:linux的查找命令,定位文件夾;大數據

/mnt/tomcat/logs/:須要清理的目錄;ui

-mtime:語法結構,固定寫法;spa

+30:天數;pwa

"*.log":*是匹配全部,整個是匹配全部的後綴爲.log的文件;

-exec:語法結構,固定寫法;

rm -rf:強制循環刪除文件,及文件夾;

{} \; :語法結構,固定寫法; 

 

crontab計劃任務使用

建立腳本文件:

 

#vi del-log.sh

切換到insert模式輸入:

  #!/bin/sh  

  find /mnt/tomcat/logs/ -mtime +35 -name "*.log" -exec rm -rf {} \;

 

受權:

chmod +x del-log.sh

增長系統計劃任務:

crontab -e

11 11 * * * /mnt/tomcat/logs/del-log.sh >/dev/null 2>&1

這樣天天11點11分系統就自動執行del-log.sh文件,即執行find /mnt/tomcat/logs/ -mtime +35 -name "*.log" -exec rm -rf {} \;語句,來對日誌文件進行清理。

其餘自動清除日誌腳本

 
  1. #!/bin/sh  
  2. ###########################  
  3. #delete log blog.duplicatedcode.com  
  4. # in_day_num: like 1 2 is delete 2day ago logs  
  5. # in_log_path like tomcat log home  
  6. ###########################  
  7. in_log_path=${1}  
  8. in_day_num=${2}  
  9. tmp_delete_log=/var/log/deletelog/"`date +%Y%m`.log"  
  10.   
  11. deleteLog()  
  12. {  
  13.     inner_num=${1}  
  14.    #find log  
  15.    echo "[`date`] >> start delete logs---" >> $tmp_delete_log  
  16.    find ${in_log_path} -type f -mtime ${inner_num} -print0 | xargs -0 rm -rf  
  17.    echo "[`date`] >> end delete logs---" >> $tmp_delete_log  
  18. }  
  19. init()  
  20. {  
  21.    mkdir -p /var/log/deletelog/  
  22. }  
  23. main()  
  24. {  
  25.    init  
  26.    if [ -z ${in_log_path} ]; then  
  27.        echo "[`date`] >> error log_path not init---" >> $tmp_delete_log  
  28.        return  
  29.    fi  
  30.    inner_day_num=+7  
  31.    if [[ -n ${in_day_num} ]] && [[ ${in_day_num} -ge 1 ]] ; then  
  32.        ${inner_day_num}=${in_day_num}  
  33.     else  
  34.         ${inner_day_num}="+"${in_day_num}  
  35.    fi  
  36.    deleteLog ${inner_day_num}  
  37. }  
  38. #first run main  
  39. main  
       其中可輸入日誌所在目錄和刪除時間(如數字1表明1天前),find -type f -print 時會根據換行或者空格來輸出查找的文件,在不一樣的sh下有不一樣的反應,若是不作處理結合xargs 進行刪除操做,會有影響,因此須要增長-print0用 null來做爲邊界符號,纔敢結合 xargs -0來格式化輸入。使用find 的時候 遵循最小結果集原則,find解析式從左到右,全部確保你在最左邊的過濾符號可以過濾最大數據。
       該腳本可結合crontab進行自動部署清理日誌,在/var/log/deltelog/ 生成按照月的清理日誌記錄。

Linux下自動清理/tmp文件夾的原理

          Linux系統中/tmp文件夾裏面的文件會被清空,至於多長時間被清空,如何清空的?
         在linux中tmpwatch命令的做用是刪除一段時間內不使用的文件(removes files which haven’t been accessed for a period of time),在/etc/cron.daily/tmpwatc的計劃任務中:
 
  1. #! /bin/sh  
  2. flags=-umc  
  3. /usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \  
  4.         -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \  
  5.         -X '/tmp/hsperfdata_*' 10d /tmp  
  6. /usr/sbin/tmpwatch "$flags" 30d /var/tmp  
  7. for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do  
  8.     if [ -d "$d" ]; then  
  9.         /usr/sbin/tmpwatch "$flags" -f 30d "$d"  
  10.     fi  
  11. done  

tmpwatch參數

-a或–all  刪除任何類型的文件。

-m或–mtime   根據文件被更改時間

-c或–ctime     根據文件更改狀態時間

-M或–dirtime  根據文件夾被更改時間

-f或–force  強制刪除文件或目錄,其效果相似rm指令的」-f」參數。

-l  不刪除符號連接

-U或–exclude-user=用戶名或uid  排除某用戶的文件

-x 或–exclude=path 排除某路徑

-X 或–exclude-pattern=pattern 排除某規則下的路徑

-q或–quiet  不顯示指令執行過程。

-v或–verbose  詳細顯示指令執行過程。

-test  僅做測試,並不真的刪除文件或目錄。

第一行至關於一些標記(參數),第二行就是針對/tmp目錄裏面排除的目錄,第三行,這是對這個/tmp目錄的清理。
/usr/sbin/tmpwatch "$flags" 30d /var/tmp中30d是30天, 系統自動清理/tmp文件夾的默認時限是30天,決定了30天清理/tmp下不訪問的文件,若想一天一清理的話,把30d改爲1d。
若是你設置更短的時間來清理的話,好比說是30分鐘、10秒等,在這個文件中設置後,reboot後時間到了也不清理/tmp文件夾裏面的內容,由於tmpwatch所在的位置是/etc/cron.daily/目錄下,而這個目錄是天天執行一次計劃任務,因此就不起做用了。

 

 

總結

(1)crontab定時任務在文件清理方面又很大的應用,能夠設置關機任務、啓動腳本和一些程序的檢測操做。

(2)清除日誌可採用cat /dev/null > /var/lig/messages,能夠防止rm -f致使的程序已經打開文件句柄沒法正確釋放日誌文件和寫入、文件顯示磁盤空間未釋放等問題。

相關文章
相關標籤/搜索