一、原因
寫這篇的原因是項目中log沒有定時清除,服務器上項目是用腳本啟動,log文件只會在啟動時生成一次,這時,由於項目在不斷運行中,導致log越來越大。如果刪除log文件,還得把項目停掉在啟動,這樣顯然是不行的,而如果直接刪掉log文件的話,后續的操作不會輸出,也沒有日志文件生成,這時就只能通過寫個腳本定時去清除日志(每日一清)。
二、分析
這里可以看到在local目錄下有8個文件夾,即8個項目,右邊圖為某一個項目下的具體的log。
三、方法
這時我想的肯定是希望能寫一個腳本把這些日志清除掉,但不是刪除掉。那么現在需要實現3步:
1.找到8個項目的log的位置
2.清除log內容
3.定時執行腳本
有了思路,查找了資料后,找到了幾個相關的命令:
find . -name 'p.*.log'
.:具體目錄下,建議最好寫出查詢的具體的目錄,類似,/var/local/
'p*.log':模糊查詢p開頭.log結尾的文件
find /var/local/ -name 'p*.log' -type f -print :將符合的文件打印出來:
找到了log文件后這時我們只需要清除就好了:
find -name -exec command:find的常用命令結構中有這樣一條,具體的可以自行去百度。
清除文件的命令:
truncate -s 0 aa.txt {} \; : 切記,這里的“;”號不能省略, 意思是將aa.txt的大小變成0M,即把aa.txt的內容清空了。百度truncate的用法。
rm -rf/-r xxx :這個是刪除文件或文件夾,不能達到我的要求
結合上面的命令,就有了如下這樣一條:
find /var/local/ -name 'p*.log' -type f -print -exec truncate -s 0 {} \; : 將符合這樣一個條件的文件查到出來並賦予它0M的大小。
下面我們就可以清除日志的腳本了,如何寫就不講了:
1 #!/bin/bash 2 3 status(){ 4 date 5 find /var/local/ -name 'p*.log' -type f -print -exec truncate -s 0 {} \; 6 echo "清空log成功" 7 return 8 } 9 10 case "$1" in 11 status) 12 status;;*) 13 echo "清除失敗" 14 esac
四、定時任務
常用命令:
crontab -l :查看定時任務
crontab -e :添加任務
crontab -r :刪除任務
cat /etc/crontab :查看crontab文件
現在我們來添加一條任務:
59 23 * * * /var/local/clearlog.sh status >>/var/local/clear.txt :每天23:59執行腳本並輸出到clear.txt文件 ,定時任務的寫法:*(分) *(時) *(日) *(月) *(周) command
添加好后查看(crontab -l ),會發現有一條任務(為方便測試,這里可自行替換周期,如:*/1 * * * * :每分鍾執行一次 ):
這是可能出現clear.txt生成了。但是沒有內容,日志也沒清除,這個原因可能是你沒給這個腳本賦權限:
chmod 755 clearlog.sh
PS:再解決這個問題過程中,碰到了一個問題,那就是在編輯一個文件時,寫完后習慣性的CTRL+S,然后窗口就不能編輯了,退也退不了,后來查了,發現:
Ctrl s 暫停該終端 (解決辦法:Ctrl q)
Ctrl c 中止當前正在執行的程序。
Ctrl d 相當於exit命令
OK。