SIGWINCH not working on second on-the-fly binary upgrade

Maxim Dounin mdounin at
Tue Nov 15 17:55:47 UTC 2011


On Tue, Nov 15, 2011 at 02:38:31PM -0200, Eduardo Habkost wrote:

> I was trying to upgrade nginx from 1.0.9 to 1.0.10 on-the-fly, using
> the process described on the wiki[1], but it looks like it is ignoring
> the SIGWINCH signal I send to it.


> After a quick look at the code, it looks like this happened because
> the 1.0.9 process I am running was started during a previous
> 1.0.7->1.0.9 on-the-fly upgrade, and the 1.0.9 master process now
> thinks it is not daemonized (ngx_daemonized is not set on
> initialization if ngx_inherited is set).
> I have easily reproduced it by killing nginx completely, making a
> on-the-fly 1.0.10->1.0.10 executable upgrade twice. On the first try,
> SIGWINCH works; after the first upgrade, SIGWINCH stops working. Full
> shell session showing the bug is pasted at the end of my message.

Yes, thank you, this is a bug introduced in 1.1.1/1.0.9.

As a workaround SIGQUIT to old master process may be used (it 
doesn't allow to revive old master, but allow upgrade).

The following patch should fix this:

diff --git a/src/core/nginx.c b/src/core/nginx.c
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -374,6 +374,10 @@ main(int argc, char *const *argv)
         ngx_daemonized = 1;
+    if (ngx_inherited) {
+        ngx_daemonized = 1;
+    }
     if (ngx_create_pidfile(&ccf->pid, cycle->log) != NGX_OK) {

Maxim Dounin

More information about the nginx mailing list