mirror of
https://github.com/nginx/nginx.git
synced 2025-06-07 17:52:38 +08:00
Fixed "changing binary" when reaper is not init.
On some systems, it's possible that reaper of orphaned processes is set to something other than "init" process. On such systems, the changing binary procedure did not work. The fix is to check if PPID has changed, instead of assuming it's always 1 for orphaned processes.
This commit is contained in:
parent
7a7fc708fb
commit
afad219175
@ -228,6 +228,7 @@ main(int argc, char *const *argv)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
ngx_pid = ngx_getpid();
|
ngx_pid = ngx_getpid();
|
||||||
|
ngx_parent = ngx_getppid();
|
||||||
|
|
||||||
log = ngx_log_init(ngx_prefix);
|
log = ngx_log_init(ngx_prefix);
|
||||||
if (log == NULL) {
|
if (log == NULL) {
|
||||||
|
@ -26,6 +26,7 @@ ngx_daemon(ngx_log_t *log)
|
|||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngx_parent = ngx_pid;
|
||||||
ngx_pid = ngx_getpid();
|
ngx_pid = ngx_getpid();
|
||||||
|
|
||||||
if (setsid() == -1) {
|
if (setsid() == -1) {
|
||||||
|
@ -194,6 +194,7 @@ ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data,
|
|||||||
return NGX_INVALID_PID;
|
return NGX_INVALID_PID;
|
||||||
|
|
||||||
case 0:
|
case 0:
|
||||||
|
ngx_parent = ngx_pid;
|
||||||
ngx_pid = ngx_getpid();
|
ngx_pid = ngx_getpid();
|
||||||
proc(cycle, data);
|
proc(cycle, data);
|
||||||
break;
|
break;
|
||||||
@ -371,12 +372,12 @@ ngx_signal_handler(int signo, siginfo_t *siginfo, void *ucontext)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ngx_signal_value(NGX_CHANGEBIN_SIGNAL):
|
case ngx_signal_value(NGX_CHANGEBIN_SIGNAL):
|
||||||
if (getppid() > 1 || ngx_new_binary > 0) {
|
if (ngx_getppid() == ngx_parent || ngx_new_binary > 0) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ignore the signal in the new binary if its parent is
|
* Ignore the signal in the new binary if its parent is
|
||||||
* not the init process, i.e. the old binary's process
|
* not changed, i.e. the old binary's process is still
|
||||||
* is still running. Or ignore the signal in the old binary's
|
* running. Or ignore the signal in the old binary's
|
||||||
* process if the new binary's process is already running.
|
* process if the new binary's process is already running.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -54,6 +54,7 @@ typedef struct {
|
|||||||
|
|
||||||
|
|
||||||
#define ngx_getpid getpid
|
#define ngx_getpid getpid
|
||||||
|
#define ngx_getppid getppid
|
||||||
|
|
||||||
#ifndef ngx_log_pid
|
#ifndef ngx_log_pid
|
||||||
#define ngx_log_pid ngx_pid
|
#define ngx_log_pid ngx_pid
|
||||||
@ -79,6 +80,7 @@ extern char **ngx_argv;
|
|||||||
extern char **ngx_os_argv;
|
extern char **ngx_os_argv;
|
||||||
|
|
||||||
extern ngx_pid_t ngx_pid;
|
extern ngx_pid_t ngx_pid;
|
||||||
|
extern ngx_pid_t ngx_parent;
|
||||||
extern ngx_socket_t ngx_channel;
|
extern ngx_socket_t ngx_channel;
|
||||||
extern ngx_int_t ngx_process_slot;
|
extern ngx_int_t ngx_process_slot;
|
||||||
extern ngx_int_t ngx_last_process;
|
extern ngx_int_t ngx_last_process;
|
||||||
|
@ -31,6 +31,7 @@ static void ngx_cache_loader_process_handler(ngx_event_t *ev);
|
|||||||
ngx_uint_t ngx_process;
|
ngx_uint_t ngx_process;
|
||||||
ngx_uint_t ngx_worker;
|
ngx_uint_t ngx_worker;
|
||||||
ngx_pid_t ngx_pid;
|
ngx_pid_t ngx_pid;
|
||||||
|
ngx_pid_t ngx_parent;
|
||||||
|
|
||||||
sig_atomic_t ngx_reap;
|
sig_atomic_t ngx_reap;
|
||||||
sig_atomic_t ngx_sigio;
|
sig_atomic_t ngx_sigio;
|
||||||
|
@ -14,6 +14,7 @@ typedef DWORD ngx_pid_t;
|
|||||||
|
|
||||||
|
|
||||||
#define ngx_getpid GetCurrentProcessId
|
#define ngx_getpid GetCurrentProcessId
|
||||||
|
#define ngx_getppid() 0
|
||||||
#define ngx_log_pid ngx_pid
|
#define ngx_log_pid ngx_pid
|
||||||
|
|
||||||
|
|
||||||
@ -73,6 +74,7 @@ extern ngx_int_t ngx_last_process;
|
|||||||
extern ngx_process_t ngx_processes[NGX_MAX_PROCESSES];
|
extern ngx_process_t ngx_processes[NGX_MAX_PROCESSES];
|
||||||
|
|
||||||
extern ngx_pid_t ngx_pid;
|
extern ngx_pid_t ngx_pid;
|
||||||
|
extern ngx_pid_t ngx_parent;
|
||||||
|
|
||||||
|
|
||||||
#endif /* _NGX_PROCESS_H_INCLUDED_ */
|
#endif /* _NGX_PROCESS_H_INCLUDED_ */
|
||||||
|
@ -31,6 +31,7 @@ static ngx_thread_value_t __stdcall ngx_cache_loader_thread(void *data);
|
|||||||
ngx_uint_t ngx_process;
|
ngx_uint_t ngx_process;
|
||||||
ngx_uint_t ngx_worker;
|
ngx_uint_t ngx_worker;
|
||||||
ngx_pid_t ngx_pid;
|
ngx_pid_t ngx_pid;
|
||||||
|
ngx_pid_t ngx_parent;
|
||||||
|
|
||||||
ngx_uint_t ngx_inherited;
|
ngx_uint_t ngx_inherited;
|
||||||
ngx_pid_t ngx_new_binary;
|
ngx_pid_t ngx_new_binary;
|
||||||
|
Loading…
Reference in New Issue
Block a user