"unicorn -D" always returns 0 "success" (even when failed to load)
normalperson at yhbt.net
Wed Dec 23 02:26:17 EST 2009
Iñaki Baz Castillo <ibc at aliax.net> wrote:
> Hi, I'm writing a Debian init script for unicorn and realized that when
> starting unicorn with daemonize option, the command always returns 0, even if
> the start action failed (due for example Errno::EADDRINUSE).
> Returning 0 in such case is not good as it breaks service init scripts or
> service controllers (as HeartBeat) that fully rely on the appropriate exit
> Is there some way to determine if unicorn failed to start when using "-D"?
No way to determine that currently, as I've never encountered the need.
For validating startups, most folks I know have specific endpoint(s) in
application dedicated to checks. That way they can get way more info
and all the way down into stack including things like database/memcached
Anything less is superficial because they can fail to detect other
misconfigurations (including stuff like wrong RAILS_ENV); not just
> Another related issue: When the Rack config.ru file contains some error (as a
> typo) the worker(s) returns 1 (at the moment usually). Then unicorn master
> process reapes the terminated worker process and restarts it. Of course it
> would fail again and again. Anyhow "unicorn -D" returns 0 again (success).
> Usually if a worker (all the workers) fail to start at the moment of running
> it, it obviously means that there is some error in the application with
> prevents it to run. It could be great if Unicorn could detect it.
I'm generally hesitant to introduce code/features/bloat that aren't
helpful to people who properly test configurations before deploying :)
Adding this code doesn't solve problems. Either way the site can become
inaccessible/unusable and problems are noticeable very quickly.
If there's sufficient interest, I'll consider accepting a small patch
for this. Right now I'm unconvinced...
> For that I suggest something as a new option "--validation-time TIME". Let's
> suppose TIME is 5 seconds. In case *all* the workers fail within 5 seconds
> after starting unicorn, then unicorn understands that the Rack application is
> wrong (or any other error as Errno::EADDRINUSE) so terminates all the workers
> and itself (and hopefully returns 1 or any other non-zero exit status).
> Of course, all the above means that Unicorn should wait TIME seconds before
> being daemonized (so after TIME seconds it can decide which code to return).
> Does it make sense? Thanks a lot.
We avoid introducing command-line options since they're unlikely to be
compatible with "rackup" parsing of the "#\" lines in .ru files.
More information about the mongrel-unicorn