http://techlog.cn/article/list/10182649
子进程共有一下五种模式,即 respawn 参数有以下取值:
#define NGX_PROCESS_NORESPAWN -1 // 子进程退出时,父进程不再创建
#define NGX_PROCESS_JUST_SPAWN -2 //用于在子进程退出并重新创建后标记是刚刚创建的新进程,防止被父进程意外终止
#define NGX_PROCESS_RESPAWN -3 // 子进程退出时,父进程需要重新创建
#define NGX_PROCESS_JUST_RESPAWN -4 // 该标记用来标记进程数组中哪些是新创建的子进程
#define NGX_PROCESS_DETACHED -5 // 热代码替换
- ngx_read_channel
当新创建的子进程通过ngx_pass_open_channel()--->ngx_write_channel()传递fd[0]时,其他接收子进程的调用堆栈如下
(gdb) bt
#0 ngx_read_channel (s=11, ch=0x7fffffffe050, size=32, log=0x6f6798) at src/os/unix/ngx_channel.c:112
#1 0x0000000000437fc5 in ngx_channel_handler (ev=0x716dc8) at src/os/unix/ngx_process_cycle.c:1112
#2 0x00000000004393da in ngx_epoll_process_events (cycle=0x6f6780, timer=500, flags=1)
at src/event/modules/ngx_epoll_module.c:685
#3 0x0000000000429b84 in ngx_process_events_and_timers (cycle=0x6f6780) at src/event/ngx_event.c:248
#4 0x00000000004372d9 in ngx_worker_process_cycle (cycle=0x6f6780, data=0x0) at src/os/unix/ngx_process_cycle.c:822
#5 0x0000000000433ae6 in ngx_spawn_process (cycle=0x6f6780, proc=0x4370f0 <ngx_worker_process_cycle>, data=0x0,
name=0x4b89cb "worker process", respawn=-3) at src/os/unix/ngx_process.c:198
#6 0x0000000000436083 in ngx_start_worker_processes (cycle=0x6f6780, n=3, type=-3) at src/os/unix/ngx_process_cycle.c:368
#7 0x00000000004356c1 in ngx_master_process_cycle (cycle=0x6f6780) at src/os/unix/ngx_process_cycle.c:140
#8 0x0000000000403573 in main (argc=1, argv=0x7fffffffe6b8) at src/core/nginx.c:407
- ngx_write_channel 由主进程master负责把新创建的子进程的fd信息传递给其他先创建的子进程
(gdb) bt
#0 ngx_write_channel (s=7, ch=0x7fffffffe250, size=32, log=0x6f6798) at src/os/unix/ngx_channel.c:29
#1 0x0000000000436423 in ngx_pass_open_channel (cycle=0x6f6780, ch=0x7fffffffe250) at src/os/unix/ngx_process_cycle.c:458
#2 0x00000000004360db in ngx_start_worker_processes (cycle=0x6f6780, n=3, type=-3) at src/os/unix/ngx_process_cycle.c:375
#3 0x00000000004356c1 in ngx_master_process_cycle (cycle=0x6f6780) at src/os/unix/ngx_process_cycle.c:140
#4 0x0000000000403573 in main (argc=1, argv=0x7fffffffe6b8) at src/core/nginx.c:407
主进程创建完子进程,传递完子进程信息后,
ngx_start_cache_manager_processes()
最后sigsuspend() 等待信号处理
此时,在终端kill -9 pid_of_one_worker,将会唤醒master进程,sigsuspend()返回
主进程将会向其他子进程通知刚刚挂掉的进程信息,改写ngx_processes[]信息
然后重新创建一个子进程,并再次更新ngx_processes[]信息