nginx-0.0.1-2004-01-14-00:33:59 import
diff --git a/src/os/unix/ngx_os.h b/src/os/unix/ngx_os.h index 8d9a6de..1616612 100644 --- a/src/os/unix/ngx_os.h +++ b/src/os/unix/ngx_os.h
@@ -50,7 +50,9 @@ extern ngx_int_t ngx_process; +extern ngx_pid_t ngx_new_binary; +extern ngx_int_t ngx_inherited; extern ngx_int_t ngx_signal; extern ngx_int_t ngx_reap; extern ngx_int_t ngx_quit;
diff --git a/src/os/unix/ngx_posix_init.c b/src/os/unix/ngx_posix_init.c index d5f28d0..b23dc31 100644 --- a/src/os/unix/ngx_posix_init.c +++ b/src/os/unix/ngx_posix_init.c
@@ -42,6 +42,8 @@ "SIG" ngx_value(NGX_CHANGEBIN_SIGNAL), ngx_signal_handler }, + { SIGINT, "SIGINT", ngx_signal_handler }, + { SIGCHLD, "SIGCHLD", ngx_signal_handler }, { SIGPIPE, "SIGPIPE, SIG_IGN", SIG_IGN }, @@ -93,10 +95,12 @@ { char *action; struct timeval tv; + ngx_int_t ignore; ngx_err_t err; ngx_signal_t *sig; ngx_signal = 1; + ignore = 0; err = ngx_errno; @@ -138,11 +142,31 @@ break; case ngx_signal_value(NGX_REOPEN_SIGNAL): - ngx_reopen = 1; - action = ", reopen logs"; - break; + if (ngx_noaccept) { + action = ", ignoring"; + + } else { + ngx_reopen = 1; + action = ", reopen logs"; + break; + } case ngx_signal_value(NGX_CHANGEBIN_SIGNAL): + if ((ngx_inherited && getppid() > 1) + || (!ngx_inherited && ngx_new_binary > 0)) + { + /* + * Ignore the signal in the new binary if its parent is + * not the init process, i.e. the old binary's process + * is still running. Or ingore the signal in the old binary's + * process if the new binary's process is already running. + */ + + action = ", ignoring"; + ignore = 1; + break; + } + ngx_change_binary = 1; action = ", changing binary"; break; @@ -189,6 +213,13 @@ ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, "signal %d (%s) received%s", signo, sig->signame, action); + if (ignore) { + ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, 0, + "the changing binary signal is ignored: " + "you should shutdown or terminate " + "before either old or new binary's process"); + } + if (signo == SIGCHLD) { ngx_process_get_status(); }
diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c index 4a80257..f591383 100644 --- a/src/os/unix/ngx_process.c +++ b/src/os/unix/ngx_process.c
@@ -85,17 +85,10 @@ } -ngx_int_t ngx_exec(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx) +ngx_pid_t ngx_exec(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx) { - if (ngx_spawn_process(cycle, ngx_exec_proc, ctx, ctx->name, - NGX_PROCESS_DETACHED) == NGX_ERROR) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "can not spawn %s", ctx->name); - return NGX_ERROR; - } - - return NGX_OK; + return ngx_spawn_process(cycle, ngx_exec_proc, ctx, ctx->name, + NGX_PROCESS_DETACHED); } @@ -154,6 +147,9 @@ ngx_uint_t i; for (i = 0; i < ngx_last_process; i++) { + ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, + "proc table " PID_T_FMT, ngx_processes[i].pid); + if (ngx_processes[i].exiting || !ngx_processes[i].exited) { continue; }
diff --git a/src/os/unix/ngx_process.h b/src/os/unix/ngx_process.h index 1eb545b..5b56509 100644 --- a/src/os/unix/ngx_process.h +++ b/src/os/unix/ngx_process.h
@@ -46,7 +46,7 @@ ngx_pid_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); +ngx_pid_t ngx_exec(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx); 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);