Created
September 29, 2009 20:08
-
-
Save defunkt/197263 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
== Signal handling | |
In general, signals need only be sent to the master process. However, | |
the signals Unicorn uses internally to communicate with the worker | |
processes are documented here as well. | |
=== Master Process | |
* HUP - reload config file, app, and gracefully restart all workers | |
* INT/TERM - quick shutdown, kills all workers immediately | |
* 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. | |
* 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 | |
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. | |
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 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. | |
5. If everything seems ok, then send QUIT to the old master. You're done! | |
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. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment