In general, signals need only be sent to the master process. However, the signals Rainbows! uses internally to communicate with the worker processes are documented here as well. With the exception of TTIN/TTOU, signal handling matches the behavior of and nginx so it should be possible to easily share process management scripts between Rainbows!, unicorn and nginx.
HUP - reload config file, app, and gracefully restart all workers If the "preload_app" directive is false (the default), then workers will also pick up any application code changes when restarted. If "preload_app" is true, then application code changes will have no effect; USR2 + QUIT (see below) must be used to load newer code in this case. When reloading the application, Gem.refresh will be called so updated code for your application can pick up newly installed RubyGems. It is not recommended that you uninstall libraries your application depends on while Rainbows! is running, as respawned workers may enter a spawn loop when they fail to load an uninstalled dependency.
QUIT - graceful shutdown, waits for workers to finish their current request before finishing. Since Rainbows 5.1.0 (Jan 2017), this waits requests deferred to a separate thread with EventMachine (app.deferred?(env) => true).
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.
USR1 - Reopen all logs owned by the worker process. See Unicorn::Util.reopen_logs for what is considered a log. Unlike unicorn, log files are reopened immediately in Rainbows! since worker processes are likely to be serving multiple clients simutaneously, we can't wait for all of them to finish.
The path to the rainbows 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.
You can now send WINCH to the old master process so only the new workers serve requests. If your rainbows 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.