nginx signal 之 quit
quit信号其实和前面介绍的stop 基本一样,唯一的不同之处就是quit是一种优雅的停止,也就是进程如果还在服务中,那么就不会关闭该进程,直到进程完成服务为止。当然这个过程中不能再接受新的任务了。
一 master接受到quit信号后
//收到quit信号 case ngx_signal_value(NGX_SHUTDOWN_SIGNAL): ngx_quit = 1; action = ", shutting down"; break;
二 master看到 ngx_quit 为1 的时候
//收到quit信号 if (ngx_quit) { ngx_signal_worker_processes(cycle, ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); //关闭监听socket ls = cycle->listening.elts; for (n = 0; n < cycle->listening.nelts; n++) { if (ngx_close_socket(ls[n].fd) == -1) { ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, ngx_close_socket_n " %V failed", &ls[n].addr_text); } } cycle->listening.nelts = 0; continue; }
除了向子进程发送 quit 信号外,还关闭master进程的的listening,这样意思是不接受请求了,但是master进程本来就不接受请求的,为什么在这里关闭呢?
三 子进程收到信号后
//quit case ngx_signal_value(NGX_SHUTDOWN_SIGNAL): ngx_quit = 1; action = ", shutting down"; break;
四 子进程看到ngx_quit
//退出子进程 if (ngx_quit) { ngx_quit = 0; ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "gracefully shutting down"); ngx_setproctitle("worker process is shutting down"); if (!ngx_exiting) { //关闭监听socket ngx_close_listening_sockets(cycle); ngx_exiting = 1; } }
首先关闭监听个socket , 然后把ngx_exiting设置为1 ,表示进程当前是出于退出的过程中。
五 子进程在退出中会进行下面的调用
//正在退出中 if (ngx_exiting) { c = cycle->connections; for (i = 0; i < cycle->connection_n; i++) { /* THREAD: lock */ //idle 是 keepalive的,所以这处理 if (c[i].fd != -1 && c[i].idle) { c[i].close = 1; c[i].read->handler(c[i].read); } } //没有工作事件了 if (ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel) { ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); ngx_worker_process_exit(cycle); } }
这里查看所有的连接,如果有keepalive的,那么处理读事件(为什么不用处理写,这个还需要后面看看keepalive做了什么)
最后在看看还有没有未超时的事件,如果没有了,那么进程就可以退出了。
下面的过程和stop 一样,就不介绍了。
nginx signal 之 quit相关推荐
- Signal QQmlEngine::quit() emitted, but no receivers connected to handle it.
使用的是Rectangle,在main.cpp中添加头文件: #include<QQmlEngine> main函数中添加: QObject::connect(viewer.engine( ...
- nginx php7 fastcgi,Windows下搭建PHP7+FastCGI+Nginx环境
注意这里说的是FastCGI,不是FPM,FPM全称是FastCGI Process Manager,它是FastCGI进程管理器,在Windows下是没有这个的,只能手动启动FastCGI进程由它自 ...
- 【学习笔记】启动Nginx、查看nginx进程、查看nginx服务主进程的方式、Nginx服务可接受的信号、nginx帮助命令、Nginx平滑重启、Nginx服务器的升级
1.启动nginx的方式: cd /usr/local/nginx ls ./nginx -c nginx.conf 2.查看nginx的进程方式: [root@localhost nginx] ...
- Nginx服务的信号控制
Nginx服务的信号控制 Nginx中的master和worker进程? Nginx的工作方式? 如何获取进程的PID? 信号有哪些? 如何通过信号控制Nginx的启停等相关操作? 前面在提到Ngin ...
- 总结与整理:Ubuntu系统下安装、配置Nginx及其他注意事项
在Ubuntu下安装Nginx有以下方法,但是如果想要安装最新版本的就必须下载源码包编译安装. 一.基于APT源安装 sudo apt-get install nginx 1.安装好的文件位置: /u ...
- nginx ---- 启停
对于Nginx的启停在linux系统中也有很多种方式,我们本次课程介绍两种方式: Nginx服务的信号控制 Nginx的命令行控制 方式一: Nginx 服务的信号控制 前面在提到Nginx的高性能, ...
- CentOS7安装PHP开发环境1-源码安装Nginx
OS:CentOS 7 Nginx:1.16.0 目录 安装后的脚本 重启nginx.PHP脚本 开机启动脚本 安装前的准备 1.安装Nginx所需的pcre库 2.安装Nginx所需的openssl ...
- nginx - nginx的安装部署
目录 什么是nginx? 1. nginx的安装 1.1 yum安装和编译安装的区别 1.1.1 yum安装的优点和缺点 1.1.2 编译安装的优点和缺点 1.2 nginx编译安装脚本 1.3 ...
- Windows nginx 操作和配置
Windows nginx 操作和配置 Windows 上的 nginx 只是一个简单的程序,并不是以服务的形式存在的. 所以只需要操作原可执行文件即可. 一.下载解压 官方下载地址: http:// ...
最新文章
- 提升方法---提升树
- Android---手动创建线程与GUI线程同步(三)
- spring3.2 @Scheduled注解 定时任务
- 禁用UpdateOrchestrator重新启动任务
- 【英语学习】【Daily English】U10 Education L01 Is this certificate a must?
- java标识符定义_Java标识符命名规范
- 二十一天学通JavaScript:cookie的安全性
- java seo优化_java的seo优化-SEO技能未来发展前景
- Executing an update/delete query
- html怎么做左侧广告,网站横幅怎么制作,html横幅广告代码
- 三国志战略版:求贤之我要换啥
- CloudCompare源码分析之ccViewer模块:应用类(阅读经典)
- 如何记账,筛选指定收支类别
- openssh移植 for pycharm 远程调试 sftp
- ocr识别软件测试点,屏幕取词和OCR取词测试
- Maven Download Sources 失败
- java数组游戏_基于java的挖地雷游戏
- 【C语言】运算符的优先级,结合方向(自左向右运算、自右向左运算)
- POJ1013Counterfeit Dollar
- OpenMax在Android上的实现
热门文章
- R统计-微生物群落结构差异分析及结果解读
- 朴素贝叶斯分类算法--终极奥义
- 从零学Linux第一章——操作系统演变及历史介绍
- java向前缩进的快捷键_C++(十四) — 常用快捷键总结
- 激活层是每一层都有吗_广式小吃甜“薄撑”,又香又脆,每一层都有料,大人小孩都爱吃...
- INFORMS 及 EJOR 系列主编汇总
- java怎么设置cookie?java设置cookie教程
- vivos机器人_【vivoNEXS评测】操作:人工智能无处不在 Jovi AI正在接管系统-中关村在线...
- itchat 调用微信网页版 python 调用微信
- 模拟CMOS集成电路设计 学习笔记(二)