nginx--基于crond定时服务+shell脚本实现nginx日志自动清理及备份
【摘要】 一、学习背景大家都用过nginx,关于nginx日志自动清理、自动分割及备份压缩,方案有很多但是不论哪一种,核心原理都是使用kill -USR1 + nginx的PID进程文件来实现本文主要介绍自定义shell脚本+ crond定时任务实现。 二、shell脚本 2.1、脚本实现思路定义日志要保存的天数SAVE_DAYS=7重命名当天日志 mv ***.log ***_日期.log重新打开...
一、学习背景
- 大家都用过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
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)