設定自動清理Linux系統中n天前的檔案的方法

來源:互聯網
上載者:User

   伺服器每周會產生一次全域備份檔案,大小約100G左右,需要定期清理。

  工作時間網站訪問大,伺服器I/O高的時候刪除大資料會對伺服器狀態產生不好的影響。於是想利用計劃任務自動執行。

  在我的備份目錄/bakcup下,每次備份檔案均以日期形式命名目錄名:

  代碼如下:

  # ls

  2013-12-23 2014-01-06 2014-01-20 2014-02-03

  2013-12-30 2014-01-13 2014-01-27 2014-02-10

  刪除部份備份同時保留部分,可以使用find命令,如我要保留最近四周備份的檔案,每次備份間隔七天:

  代碼如下:

  # find /bakcup/ -maxdepth 1 -type d -mtime +28

  /bakcup/2014-01-06

  /bakcup/2014-01-13

  /bakcup/2013-12-23

  /bakcup/2013-12-30

  -maxdepth 1:設定尋找目錄深度為1,只在/backup目錄下尋找,如不加此參數會將下級目錄中的檔案都列出

  -type d:設定尋找類型為目錄

  -mtime +28:尋找28天前的目錄

  尋找結束後可用-exec參數串連刪除命令

  代碼如下:

  rsync --delete-before -d /data/test/ {} ;

  所以,整個命令就是:

  代碼如下:

  # find /bakcup/ -maxdepth 1 -type d -mtime +28 -exec rsync --delete-before -d /data/test/ {} ;

< p>

 

  最後可以把命令放入指令碼,設定crontab自動執行。

  提醒:

  使用命令前,應先在伺服器上試用尋找部分的命令,如只尋找出要清理的目錄,則可以繼續。

  不排除某些系統會將./目錄尋找出來,一定要看清楚,防止出現意外情況。

  另外可將-exec替換為-ok,效果相同,在刪除前提醒使用者確認。

  PS:rm命令與rsync命令的效率比較

  rm

  rm命令大量調用了lstat64和unlink,可以推測刪除每個檔案前都從檔案系統中做過一次lstat操作。

  lstat64的次數低於檔案總數,還有另外的原因,之後會在另一篇文章中說明。

  getdirentries64這個調用比較關鍵。

  過程:正式刪除工作的第一階段,需要通過getdirentries64調用,分批讀取目錄(每次大約為4K),在記憶體中建立rm的檔案清單;第二階段,lstat64確定所有檔案的狀態;第三階段,通過unlink執行實際刪除。這三個階段都有比較多的系統調用和檔案系統操作。

  rsync

  rsync所做的系統調用很少。

  沒有針對單個檔案做lstat和unlink操作。

  命令執行前期,rsync開啟了一片共用記憶體,通過mmap方式載入目錄資訊。

  只做目錄同步,不需要針對單個檔案做unlink。

  另外,在其他人的評測裡,rm的環境切換比較多,會造成System CPU佔用較多——對於檔案系統的操作,簡單增加並發數並不總能提升操作速度。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.