find
命令是 Linux 系統一種常見的命令,有著強大的功能,缺點是遍歷檔案查詢,效率相對低。
當你的 LNMP 平臺正式開始運作,每天會產生大量的日誌,包括 PHP 、 Nginx 、 Mysql 、 Redis 等等各種各樣的登入、警告、提示、錯誤資訊。如果日誌所在目錄過於臃腫,可能會導致伺服器執行緩慢甚至暫停執行。所以,清理這些日誌成為後端工程師日常工作中的一部分。
清理方式多種,現介紹用 find
命令進行清理的方法。
命令格式如下
find 目標目錄 查詢條件 查詢檔案 -exec 執行命令 {} \;
其中 {} 表示查詢結果, \; 為固定格式。
如果你想查詢 /var/log/
目錄下大於 200k 以 .log
結尾的檔案,並且想把查詢結果複製一份在 /opt/bak/
目錄下作為備份,命令如下
find /var/log/ -size +200k -name '*.log' -exec cp {} /opt/bk/ \;
編寫 Shell 指令碼 clear_logs.sh
減少每次手寫程式碼量,並且易於更改。
#!/bin/bash
#
#
log_path='/usr/local/nginx/logs/'
new_log_path='/home/error_logs_bk/'
cd $new_log_path
# 以年月日時分秒作為檔名稱字首
date=`date +"%Y:%m:%d:%H:%M:%S"`
# 生成備份目錄
mkdir $date.error.log
# 先備份
find $log_path -name '*error.log' -exec cp {} /home/error_logs_bk/$date.error.log \;
# 備份成功輸出成功資訊,否則就報錯退出
if [ $? -eq 0 ];then
echo 'Errorlogs backup successfully!'
else
echo 'Failure in backup fo errorlogs!'
exit
fi
# 刪除成功輸出成功信,否則就報錯退出
find $log_path -name '*error.log' -exec rm -rf {} \;
if [ $? -eq 0 ];then
echo 'Errorlogs deleted successfully!'
else
echo 'Failure in deletion fo errorlogs!'
exit
fi
執行指令碼
sh clear_logs.sh
輸出
Errorlogs backup successfully!
Errorlogs deleted successfully!
進入 /home/error_logs_bk/
目錄檢視,成功實現備份。
2020:08:30:00:16:16.error.log
如果想開機就執行指令碼,在 #/bin/bash
下新增以下程式碼
#chkconfig:2345 80 30
#description:auto_run
新增至開機自動啟動專案中
chkconfig --add clear_logs.sh
如果計劃每週六凌晨零點執行,可以使用 crontab
命令定時刪除冗餘日誌,執行 crontab -e
00 00 * * 6 /bin/bash /opt/shells/clear_logs.sh
本作品採用《CC 協議》,轉載必須註明作者和本文連結