diff options
Diffstat (limited to 'src/os/unix')
-rw-r--r-- | src/os/unix/ngx_os.h | 1 | ||||
-rw-r--r-- | src/os/unix/ngx_posix_init.c | 113 | ||||
-rw-r--r-- | src/os/unix/ngx_process.c | 20 | ||||
-rw-r--r-- | src/os/unix/ngx_process.h | 11 |
4 files changed, 95 insertions, 50 deletions
diff --git a/src/os/unix/ngx_os.h b/src/os/unix/ngx_os.h index 571bef7c3..4f59137c2 100644 --- a/src/os/unix/ngx_os.h +++ b/src/os/unix/ngx_os.h @@ -54,6 +54,7 @@ extern ngx_int_t ngx_process; extern ngx_int_t ngx_reap; extern ngx_int_t ngx_quit; extern ngx_int_t ngx_terminate; +extern ngx_int_t ngx_pause; extern ngx_int_t ngx_reconfigure; extern ngx_int_t ngx_reopen; extern ngx_int_t ngx_change_binary; diff --git a/src/os/unix/ngx_posix_init.c b/src/os/unix/ngx_posix_init.c index 769b1339b..374f60b13 100644 --- a/src/os/unix/ngx_posix_init.c +++ b/src/os/unix/ngx_posix_init.c @@ -13,7 +13,6 @@ void ngx_signal_handler(int signo); typedef struct { int signo; char *signame; - char *action; void (*handler)(int signo); } ngx_signal_t; @@ -21,39 +20,33 @@ typedef struct { ngx_signal_t signals[] = { { ngx_signal_value(NGX_RECONFIGURE_SIGNAL), "SIG" ngx_value(NGX_RECONFIGURE_SIGNAL), - ", reconfiguring", ngx_signal_handler }, { ngx_signal_value(NGX_REOPEN_SIGNAL), "SIG" ngx_value(NGX_REOPEN_SIGNAL), - ", reopen logs", ngx_signal_handler }, - { ngx_signal_value(NGX_INTERRUPT_SIGNAL), - "SIG" ngx_value(NGX_INTERRUPT_SIGNAL), - ", exiting", + { ngx_signal_value(NGX_PAUSE_SIGNAL), + "SIG" ngx_value(NGX_PAUSE_SIGNAL), ngx_signal_handler }, { ngx_signal_value(NGX_TERMINATE_SIGNAL), "SIG" ngx_value(NGX_TERMINATE_SIGNAL), - ", exiting", ngx_signal_handler }, { ngx_signal_value(NGX_SHUTDOWN_SIGNAL), "SIG" ngx_value(NGX_SHUTDOWN_SIGNAL), - ", shutdowning", ngx_signal_handler }, { ngx_signal_value(NGX_CHANGEBIN_SIGNAL), "SIG" ngx_value(NGX_CHANGEBIN_SIGNAL), - ", changing binary", ngx_signal_handler }, - { SIGCHLD, "SIGCHLD", "", ngx_signal_handler }, + { SIGCHLD, "SIGCHLD", ngx_signal_handler }, - { SIGPIPE, "SIGPIPE, SIG_IGN", NULL, SIG_IGN }, + { SIGPIPE, "SIGPIPE, SIG_IGN", SIG_IGN }, - { 0, NULL, NULL, NULL } + { 0, NULL, NULL } }; @@ -98,6 +91,7 @@ int ngx_posix_init(ngx_log_t *log) void ngx_signal_handler(int signo) { + char *action; struct timeval tv; ngx_err_t err; ngx_signal_t *sig; @@ -113,39 +107,90 @@ void ngx_signal_handler(int signo) ngx_gettimeofday(&tv); ngx_time_update(tv.tv_sec); - ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, - "signal %d (%s) received%s", - signo, sig->signame, sig->action); + action = ""; - switch (signo) { + switch (ngx_process) { - case SIGCHLD: - ngx_reap = 1; - ngx_process_get_status(); - break; + case NGX_PROCESS_MASTER: + case NGX_PROCESS_QUITING: + case NGX_PROCESS_PAUSED: + switch (signo) { - case ngx_signal_value(NGX_SHUTDOWN_SIGNAL): - ngx_quit = 1; - break; + case ngx_signal_value(NGX_SHUTDOWN_SIGNAL): + ngx_quit = 1; + action = ", shutdowning"; + break; - case ngx_signal_value(NGX_TERMINATE_SIGNAL): - case ngx_signal_value(NGX_INTERRUPT_SIGNAL): - ngx_terminate = 1; - break; + case ngx_signal_value(NGX_TERMINATE_SIGNAL): + ngx_terminate = 1; + action = ", exiting"; + break; - case ngx_signal_value(NGX_RECONFIGURE_SIGNAL): - ngx_reconfigure = 1; - break; + case ngx_signal_value(NGX_PAUSE_SIGNAL): + ngx_pause = 1; + action = ", pausing"; + break; + + case ngx_signal_value(NGX_RECONFIGURE_SIGNAL): + ngx_reconfigure = 1; + action = ", reconfiguring"; + break; + + case ngx_signal_value(NGX_REOPEN_SIGNAL): + ngx_reopen = 1; + action = ", reopen logs"; + break; + + case ngx_signal_value(NGX_CHANGEBIN_SIGNAL): + ngx_change_binary = 1; + action = ", changing binary"; + break; + + case SIGCHLD: + ngx_reap = 1; + break; + } - case ngx_signal_value(NGX_REOPEN_SIGNAL): - ngx_reopen = 1; break; - case ngx_signal_value(NGX_CHANGEBIN_SIGNAL): - ngx_change_binary = 1; + case NGX_PROCESS_WORKER: + switch (signo) { + + case ngx_signal_value(NGX_SHUTDOWN_SIGNAL): + ngx_quit = 1; + action = ", shutdowning"; + break; + + case ngx_signal_value(NGX_TERMINATE_SIGNAL): + ngx_terminate = 1; + action = ", exiting"; + break; + +#if 0 + case ngx_signal_value(NGX_REOPEN_SIGNAL): + ngx_reopen = 1; + action = ", reopen logs"; + break; +#endif + + case ngx_signal_value(NGX_RECONFIGURE_SIGNAL): + case ngx_signal_value(NGX_REOPEN_SIGNAL): + case ngx_signal_value(NGX_PAUSE_SIGNAL): + case ngx_signal_value(NGX_CHANGEBIN_SIGNAL): + action = ", ignoring"; + break; + } + break; } + ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, + "signal %d (%s) received%s", signo, sig->signame, action); + + if (signo == SIGCHLD) { + ngx_process_get_status(); + } + ngx_set_errno(err); } diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c index 4d208c2e4..685b0d150 100644 --- a/src/os/unix/ngx_process.c +++ b/src/os/unix/ngx_process.c @@ -112,7 +112,7 @@ static void ngx_exec_proc(ngx_cycle_t *cycle, void *data) } -void ngx_signal_processes(ngx_cycle_t *cycle, ngx_int_t signal) +void ngx_signal_processes(ngx_cycle_t *cycle, ngx_int_t signo) { ngx_uint_t i; @@ -122,24 +122,26 @@ void ngx_signal_processes(ngx_cycle_t *cycle, ngx_int_t signal) continue; } +#if 0 if (ngx_processes[i].exited) { if (i != --ngx_last_process) { ngx_processes[i--] = ngx_processes[ngx_last_process]; } continue; } +#endif ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, "kill (" PID_T_FMT ", %d)" , - ngx_processes[i].pid, signal); + ngx_processes[i].pid, signo); - if (kill(ngx_processes[i].pid, signal) == -1) { + if (kill(ngx_processes[i].pid, signo) == -1) { ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "kill(%d, %d) failed", ngx_processes[i].pid, signal); + "kill(%d, %d) failed", ngx_processes[i].pid, signo); continue; } - if (signal != ngx_signal_value(NGX_REOPEN_SIGNAL)) { + if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) { ngx_processes[i].exiting = 1; } } @@ -151,7 +153,7 @@ void ngx_respawn_processes(ngx_cycle_t *cycle) ngx_uint_t i; for (i = 0; i < ngx_last_process; i++) { - if (!ngx_processes[i].exited) { + if (ngx_processes[i].exiting || !ngx_processes[i].exited) { continue; } @@ -212,11 +214,7 @@ void ngx_process_get_status() for (i = 0; i < ngx_last_process; i++) { if (ngx_processes[i].pid == pid) { ngx_processes[i].status = status; - - if (!ngx_processes[i].exiting) { - ngx_processes[i].exited = 1; - } - + ngx_processes[i].exited = 1; process = ngx_processes[i].name; break; } diff --git a/src/os/unix/ngx_process.h b/src/os/unix/ngx_process.h index e8a978460..d8727c358 100644 --- a/src/os/unix/ngx_process.h +++ b/src/os/unix/ngx_process.h @@ -29,10 +29,11 @@ typedef struct { } ngx_exec_ctx_t; -#define NGX_PROCESS_SINGLE 0 -#define NGX_PROCESS_MASTER 1 -#define NGX_PROCESS_WORKER 2 -#define NGX_PROCESS_MASTER_QUIT 3 +#define NGX_PROCESS_SINGLE 0 +#define NGX_PROCESS_MASTER 1 +#define NGX_PROCESS_WORKER 2 +#define NGX_PROCESS_QUITING 3 +#define NGX_PROCESS_PAUSED 4 #define NGX_MAX_PROCESSES 1024 @@ -47,7 +48,7 @@ ngx_int_t ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data, char *name, ngx_int_t respawn); ngx_int_t ngx_exec(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx); -void ngx_signal_processes(ngx_cycle_t *cycle, ngx_int_t signal); +void ngx_signal_processes(ngx_cycle_t *cycle, ngx_int_t signo); void ngx_respawn_processes(ngx_cycle_t *cycle); void ngx_process_get_status(void); |