about summary refs log tree commit homepage
path: root/SIGNALS
diff options
context:
space:
mode:
Diffstat (limited to 'SIGNALS')
-rw-r--r--SIGNALS90
1 files changed, 77 insertions, 13 deletions
diff --git a/SIGNALS b/SIGNALS
index 40f9c3d..01b284e 100644
--- a/SIGNALS
+++ b/SIGNALS
@@ -6,19 +6,28 @@ processes are documented here as well.
 
 === Master Process
 
- * HUP - reload config file and gracefully restart all workers
+* HUP - reload config file and gracefully restart all workers
+  If "preload_app" is false (the default), the application code
+  will be reloaded when workers are restarted as well.
 
- * INT/TERM - quick shutdown, kills all workers immediately
+* INT/TERM - quick shutdown, kills all workers immediately
 
- * QUIT - graceful shutdown, waits for workers to finish their
-   current request before finishing.
+* QUIT - graceful shutdown, waits for workers to finish their
+  current request before finishing.
 
- * USR1 - reopen all logs owned by the master and all workers
-   See Unicorn::Util.reopen_logs for what is considered a log.
+* USR1 - reopen all logs owned by the master and all workers
+  See Unicorn::Util.reopen_logs for what is considered a log.
 
- * USR2 - reexecute the running binary.  A separate QUIT
-   should be sent to the original process once the child is verified to
-   be up and running.
+* USR2 - reexecute the running binary.  A separate QUIT
+  should be sent to the original process once the child is verified to
+  be up and running.
+
+* WINCH - gracefully stops workers but keep the master running.
+  This will only work for daemonized processes.
+
+* TTIN - increment the number of worker processes by one
+
+* TTOU - decrement the number of worker processes by one
 
 === Worker Processes
 
@@ -26,9 +35,64 @@ Sending signals directly to the worker processes should not normally be
 needed.  If the master process is running, any exited worker will be
 automatically respawned.
 
- * INT/TERM - quick shutdown, immediately exit
+* INT/TERM - Quick shutdown, immediately exit.
+  Unless WINCH has been sent to the master (or the master is killed),
+  the master process will respawn a worker to replace this one.
+
+* QUIT - Gracefully exit after finishing the current request.
+  Unless WINCH has been sent to the master (or the master is killed),
+  the master process will respawn a worker to replace this one.
+
+* USR1 - Reopen all logs owned by the worker process.
+  See Unicorn::Util.reopen_logs for what is considered a log.
+  Log files are not reopened until it is done processing
+  the current request, so multiple log lines for one request
+  (as done by Rails) will not be split across multiple logs.
+
+=== Procedure to replace a running unicorn executable
+
+You may replace a running instance of unicorn with a new one without
+losing any incoming connections.  Doing so will reload all of your
+application code, Unicorn config, Ruby executable, and all libraries.
+The only things that will not change (due to OS limitations) are:
+
+1. The listener backlog size of already-bound sockets
+
+2. The path to the unicorn executable script.  If you want to change to
+   a different installation of Ruby, you can modify the shebang
+   line to point to your alternative interpreter.
+
+The procedure is exactly like that of nginx:
+
+1. Send USR2 to the master process
+
+2. Check your process manager or pid files to see if a new master spawned
+   successfully.  If you're using a pid file, the old process will have
+   ".oldbin" appended to its path.  You should have two master instances
+   of unicorn running now, both of which will have workers servicing
+   requests.  Your process tree should look something like this:
+
+     unicorn master (old)
+     \_ unicorn worker[0]
+     \_ unicorn worker[1]
+     \_ unicorn worker[2]
+     \_ unicorn worker[3]
+     \_ unicorn master
+        \_ unicorn worker[0]
+        \_ unicorn worker[1]
+        \_ unicorn worker[2]
+        \_ unicorn worker[3]
+
+3. You can now send WINCH to the old master process so only the new workers
+   serve requests.  If your unicorn process is bound to an interactive
+   terminal, you can skip this step.  Step 5 will be more difficult but
+   you can also skip it if your process is not daemonized.
+
+4. You should now ensure that everything is running correctly with the
+   new workers as the old workers die off.
 
- * QUIT - gracefully exit after finishing the current request
+5. If everything seems ok, then send QUIT to the old master.  You're done!
 
- * USR1 - reopen all logs owned by the worker process
-   See Unicorn::Util.reopen_logs for what is considered a log.
+   If something is broken, then send HUP to the old master to reload
+   the config and restart its workers.  Then send QUIT to the new master
+   process.