一、學習背景
- 大家都用過nginx,關于nginx日志
自動清理、自動分割及備份壓縮,方案有很多 - 但是不論哪一種,核心原理都是使用
kill -USR1+nginx的PID行程檔案來實作 - 本文主要介紹自定義shell腳本+
crond定時任務實作,
二、shell腳本
2.1、腳本實作思路
- 定義日志要保存的天數
SAVE_DAYS=7 - 重命名當天日志
mv ***.log ***_日期.log - 重新打開nginx日志檔案
kill -USR1 nginx的PID行程檔案 - 壓縮已備份日志(節省空間)
gzip ***_日期.log - 清理保存天數之前的日志
find 路徑 -type f -mtime +幾天前 | xargs rm -f
2.2、完整腳本
clearNginxLog.sh
#!/bin/sh
#Command:/usr/nginx/nginx/tools/clearNginxLog.sh
#Execute time: 00:00:00
LOGS_PATH=/usr/nginx/logs/nginx
#nginx pid path
PID=/usr/nginx/nginx/nginx.pid
#nginx logs save days
SAVE_DAYS=7
#backup data format
TODAY=$(date -d 'today' +%Y-%m-%d)
CURRENTTIME=$(date -d 'today' +%Y-%m-%d-%H-%M-%S)
logfile=$LOGS_PATH/clearNginxLog_${TODAY}.log
echo "`date +%Y-%m-%d` `date +%H-%M-%S` Start run the shell $0." >> ${logfile}
echo "Security check start." >> ${logfile}
if [ $LOGS_PATH == "/" ] || [ $LOGS_PATH == "/etc" ] || [ $LOGS_PATH == "/opt" ] || [ $LOGS_PATH == "/usr" ];then
echo "Nginx logs path is not right!!!" >> ${logfile}
exit 1;
fi
if [ -z "$LOGS_PATH" ];then
echo "Nginx logs path is null!!!" >> ${logfile}
exit 1;
fi
if [ -z "$SAVE_DAYS" ];then
SAVE_DAYS=7
fi
echo "Security check success." >> ${logfile}
echo "Move and rename logs start."
if [ -f ${LOGS_PATH}/error_${TODAY}.log.gz ];then
TODAY=$CURRENTTIME
fi
if [ -f ${LOGS_PATH}/access_${TODAY}.log.gz ];then
TODAY=$CURRENTTIME
fi
if [ -f ${LOGS_PATH}/host.access_${TODAY}.log.gz ];then
TODAY=$CURRENTTIME
fi
echo "Move and rename logs finished."
#bak log files
mv ${LOGS_PATH}/host.access.log ${LOGS_PATH}/host.access_${TODAY}.log
mv ${LOGS_PATH}/error.log ${LOGS_PATH}/error_${TODAY}.log
mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${TODAY}.log
#RESTART nginx process open file pid
kill -USR1 `cat ${PID}`
#Compress xxx.log to xxx.log.gz and auto remove xxx.log
if [ -f "/usr/bin/gzip" ];then
gzip ${LOGS_PATH}/host.access_${TODAY}.log
gzip ${LOGS_PATH}/error_${TODAY}.log
gzip ${LOGS_PATH}/access_${TODAY}.log
fi
echo "Move and rename logs success." >> ${logfile}
echo "Command: find ${LOGS_PATH} -type f -mtime +{SAVE_DAYS} | xargs rm -f" >> ${logfile}
echo "clear files:" >> ${logfile}
find ${LOGS_PATH} -type f -mtime +${SAVE_DAYS} -print >> ${logfile}
find ${LOGS_PATH} -type f -mtime +${SAVE_DAYS} | xargs rm -f
echo "`date +%Y-%m-%d` `date +%H-%M-%S` End run the shell $0." >> ${logfile}
exit 0
3.1 上傳shell腳本
- 創建腳本存放目錄
mkdir -p /usr/nginx/nginx/tools/ - 將shell腳本
clearNginxLog.sh上傳到Linux服務器的/usr/nginx/nginx/tools/目錄下
3.2 手動驗證shell腳本
- 進入腳本存放目錄
cd /usr/nginx/nginx/tools/ - 手動執行shell腳本
sh clearNginxLog.sh


三、crond定時任務
3.3 crond定時服務
- 定時任務的作用是定時的去執行自定義好的
clearNginxLog.sh腳本 - Linux定時執行腳本的方式有很多,這里使用
crond服務來實作定時任務 crond是Linux作業系統自帶的定時服務,自帶守護行程,一般用于運行計劃任務如系統備份、日志分割及清理,crond服務適合在那些24x7不間斷運行的機器如服務器上運行的計劃任務,
3.4 配置crond任務
-
crond運算式
示例1:0 0 * * *每天整點執行
示例2:*/1 0 * * *每隔一分鐘執行
–引數說明
crond運算式從左右分別表示分鐘(0-59)小時(0-23)日期(1-31)月份(1-12)星期(0-6,0代表星期天) -
驗證crond配置
配置當前用戶crond的執行命令/usr/bin/crontab -e
修改指令內容為如下command指令,表示每分鐘執行腳本,驗證crond定時任務是否正常:
*/1 * * * * /bin/sh /usr/nginx/nginx/tools/clearNginxLog.sh -
實時查看cron執行日志(這里只有
root用戶有權限查看~)
tail -f /var/log/cron

-
修改crond定時任務為
每日整點執行
0 0 * * * /bin/sh /home/nginx/tools/clearNginxLog.sh
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292151.html
標籤:其他
下一篇:第一章、FastDFS簡介
