下面是一个nginx日志文件切割的计划任务
[root@proxy ~]# vim /usr/local/nginx/logbak.sh
#!/bin/bash
date=`date +%Y%m%d`
logpath=/usr/local/nginx/logs
if [ -f $logpath/nginx.pid ];then
mv $logpath/access.log $logpath/access-$date.log
mv $logpath/error.log $logpath/error-$date.log
kill -USR1 $(cat $logpath/nginx.pid)
fi
[root@proxy ~]# crontab -e
03 03 * * 5 /usr/local/nginx/logbak.sh
咱们先来看看 kill -USR1 $(cat $logpath/nginx.pid) 这条命令做了些什么
1 首先确定一下/usr/local/nginx/logs/nginx.pid 这个文件存储的是nginx的pid号,当启动nginx这个程序时会自动生成这个文件,当关闭nginx程序时,这个nginx.pid的文件就会消失。
[root@proxy ~]# ss -antulp | grep nginx
tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=3960,fd=6),("nginx",pid=3959,fd=6),("nginx",pid=3958,fd=6))
[root@proxy ~]# cat /usr/local/nginx/logs/nginx.pid
3958
##################################################################
[root@proxy ~]# nginx -s stop
[root@proxy ~]# cat /usr/local/nginx/logs/nginx.pid
cat: /usr/local/nginx/logs/nginx.pid: 没有那个文件或目录
2 $(cat $logpath/nginx.pid)相当与`cat $logpath/nginx.pid` 它拿到的是nginx的进程pid号,我这里的是3958
那么完整命令为:kill -USR1 3958
-USR1代表什么呢 ,我们接着往下看
[root@proxy ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
在linux系统中,linux是通过信号与”正在运行的进程”进行通信的。linux系统中,也有很多预定义好的信号,像常用的SIGHUP,SIGKILL,SIGSTOP等。
USR1对应的数字选项为 -10 ,那么nginx收到USR1的信号后,它都做了些什么
(1 )nginx 的主进程收到USR1信号,会重新打开日志文件(以nginx配置文件中的日志名称命名,就是配置文件中access_log项所设置的值,如果文件不存在,会自动创建一个新的文件xxx.log)。
[root@proxy ~]# /usr/local/nginx/logbak.sh
[root@proxy ~]# ls /usr/local/nginx/logs/
access-20181103.log access.log error-20181103.log error.log nginx.pid
# 执行脚本后
(2)然后把日志文件的拥有者改为“工作进程(worker进程)”,目的是让worker进程就具备了对日志文件的读写权限(master和worker通常以不同用户运行,所以需要改变拥有者)。
[root@proxy ~]# ll /usr/local/nginx/logs/access.log
-rw-r--r--. 1 nginx root 0 11月 3 13:25 /usr/local/nginx/logs/access.log
[root@proxy ~]# ll /usr/local/nginx/logs/access-20181103.log
-rw-r--r--. 1 root root 204608511 11月 3 10:44 /usr/local/nginx/logs/access-20181103.log
##注意观察这两个文件的所有者不一样
(3)nginx主进程会关闭重名的日志文件(也就是刚才使用mv命令重命名成xxx.log-$date.log的文件),并通知工作进程使用新打开的日志文件(刚才主进程打开的文件xxx.log)。具体实现上更细化点就是,主进程把USR1信号发给worker,worker接到这个信号后,会重新打开日志文件(也就是配置文件中约定的xxx.log)
3 结合上面的 kill -l 命令补充一下
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。 下面是常用的信号:
HUP 1 终端断线,重新加载配置文件,平滑升级
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止 (如果kill 命令后直接加进程的pid号 默认选项为-15 ,代表终止此进程)
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)