当运行的nginx程序收到了 stop信号后是如何处理,使整个程序停下来的呢? 总结了下,主要有下面几个步骤:
一 master进程收到 stop 信号后,把 ngx_terminate 设置为1
二 master看到ngx_terminate 为1 ,通过channel向子进程发送 NGX_CMD_TERMINATE 命令
三 子进程收到命令后,把 ngx_terminate = 1
四 子进程看到 ngx_terminate 为1 , 直接调用ngx_worker_process_exit 结束进程
五 子进程结束的时候,会向master进程发送一个 SIGCHLD 信号
六 master进程收到sigchild信号后,把ngx_reap =1 并调用 ngx_process_get_status 得到退出的进程并设置进程的状态。
七 master看到ngx_reap 就调用 ngx_reap_children 回收子进程
八 都所有的子进程都回收完毕,master就调用 ngx_master_process_exit 退出。
下面对这些过程进行详细分析:
一 ngx_process.c 中的ngx_signal_handler 函数