下面是日志切割的shell脚本:
[root@proxy ~]# vim /usr/local/nginx/logbak.sh
#!/bin/bash
date=`date +%Y%m%d`
logpath=/usr/local/nginx/logs
mv $logpath/access.log $logpath/access-$date.log
mv $logpath/error.log $logpath/error-$date.log
kill -USR1 $(cat $logpath/nginx.pid)
在日志目录下,mv日志文件并重命名加上时间,kill -USR1的意思是,如下图,kill命令有64种信号,kill命令发送USR1信号给nginx,nginx收到此信号,会重新打开日志文件(默认名称acess.log,如果文件不存在,会自动创建一个的文件access_log),并且会把日志文件的所属者改为worker进程(也就是nginx),目的是让worker进程具备对日志文件的读写权限 (此处可以ll看一下,master和worker通常以不同用户运行,所以需要改变所属者)。nginx的主进程会关闭重名的日志文件(也就是上面mv后,加上了date的文件),并且worker进程使用新打开的日志文件(也就是新的access.log)。
简单讲,主进程发送USR1信号给worker,worker收到信号后,,会重新打开日志文件(默认配置文件access.log)error.log也是同一个道理 。
每周5的03点03分自动执行脚本完成日志切割工作。(计划任务)
[root@proxy ~]# crontab -e
03 03 * * 5 /usr/local/nginx/logbak.sh