Iñaki Baz Castillo <[email protected]> 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 > code. > > Is there some way to determine if unicorn failed to start when using "-D"?
Hi Iñaki, 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 connections. Anything less is superficial because they can fail to detect other misconfigurations (including stuff like wrong RAILS_ENV); not just startup errors. > 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. -- Eric Wong _______________________________________________ Unicorn mailing list - [email protected] http://rubyforge.org/mailman/listinfo/mongrel-unicorn Do not quote signatures (like this one) or top post when replying
