龙空技术网

kill命令以及USR1信号解释

寒笛过霜天 50

前言:

而今你们对“nginx没有进程号”大概比较注意,看官们都需要了解一些“nginx没有进程号”的相关知识。那么小编在网摘上收集了一些关于“nginx没有进程号””的相关文章,希望兄弟们能喜欢,朋友们快快来学习一下吧!

咱们先来看看 kill -USR1 $(cat $logpath/nginx.pid) 这条命令做了些什么

1 首先确定一下/usr/local/nginx/logs/nginx.pid 这个文件存储的是nginx的pid号, 当启动nginx这个程序时会自动生成这个文件, 当关闭nginx程序时, 这个nginx.pid的文件就会消失。

> # cat /usr/local/nginx/logs/nginx.pid

3958

##################################################################

> # nginx -s stop

> # 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代表什么呢, 我们接着往下看

> # 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)。

> # /usr/local/nginx/logbak.sh

> # ls /usr/local/nginx/logs/

access-20181103.log access.log error-20181103.log error.log nginx.pid

# 执行脚本后

(2) 然后把日志文件的拥有者改为"工作进程(worker进程)", 目的是让worker进程就具备了对日志文件的读写权限(master和worker通常以不同用户运行, 所以需要改变拥有者)。

> # ll /usr/local/nginx/logs/access.log

-rw-r--r--. 1 nginx root 0 11月 3 13:25 /usr/local/nginx/logs/access.log

> # 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 终端断线, 重新加载配置文件, 平滑升级 SIGHUP

INT 2 中断(同 Ctrl + C) SIGINT

QUIT 3 退出(同 Ctrl + \) SIGQUIT

KILL 9 强制终止 SIGKILL

USR1 10 自定义信号(通常用于文件热更新) SIGUSR1

TERM 15 终止(如果kill 命令后直接加进程的pid号, 默认选项为-15, 代表终止此进程) SIGTERM

CONT 18 继续(与STOP相反, fg/bg命令) SIGCONT

STOP 19 暂停(同 Ctrl + Z) SIGSTOP

标签: #nginx没有进程号 #c语言关闭程序命令 #nginx对应的kill命令