From: Eric Wong <normalperson@yhbt.net>
To: unicorn list <mongrel-unicorn@rubyforge.org>
Subject: Re: "unicorn -D" always returns 0 "success" (even when failed to load)
Date: Wed, 23 Dec 2009 20:35:45 +0000 [thread overview]
Message-ID: <20091223203544.GB13735@dcvr.yhbt.net> (raw)
In-Reply-To: <200912231122.28331.ibc@aliax.net>
Iñaki Baz Castillo <ibc@aliax.net> wrote:
> El Miércoles, 23 de Diciembre de 2009, Eric Wong escribió:
> > > 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.
>
> Sure, but how to explain that to Hearteat? :)
I had a lot of trouble coming to terms with this one myself :)
Eventually I reasoned that the heartbeat mechanism is to protect against
unforeseen failures way down the line (and sometimes outside of the
application's control).
It's (hopefully) common and expected to check applications shortly
following deployments, so heartbeat isn't for that.
However applications have a tendency to break in unforseen ways, and
only in production, and at the worst times. These failures happen well
after the app is deployed :)
In my experience, it's often the least used/trafficked parts of the
application that fail, too.
Of course if you write perfect software that handles every possible
failure case and don't need heartbeat (nor multiple processes because
your code is super-efficient :), check out Zbatery[1]
[1] http://zbatery.bogomip.org/
> > If there's sufficient interest, I'll consider accepting a small patch
> > for this. Right now I'm unconvinced...
>
> I've taken a look to the code and such a feature would definitively make it
> ugly (IMHO).
>
> So I'm thinking in a different approach: a custom script to check the status
> of the application. Such script would communicate with the application (maybe
> using DRB). If the DRB connection fails (because the workers fail to start)
> then it means that something wrong occurs. And such script would also return
> the whole status (DB connections and so).
> I would include such script as "status" option in a service init script. The
> "start" action would call "status" after N seconds and decide if the
> *application* is running or not (if not then kill unicorn and exit 1).
>
> PS: Since Unicorn makes usage of signals, is there any way to determine (by
> using a signal) if the process running with some PID is an unicorn process?
>
> This is: usually to verify the process status the PID file/value is inspected.
> If there is a process running under such PID then we "assume" that process is
> Unicorn. In case that PID is stolen by any other process (since PID file
> wasn't deleted) nobody realizes of it.
Under modern Linux systems, you have several options...
tr '\0' ' ' < /proc/$PID/cmdline # show the command-line
pmap $PID | grep unicorn_http.so # not many other things load this
lsof -p $PID # can check listening ports/log files
Unfortunately I don't use other OSes enough to remember the
equivalents...
> A way to determine it could be asking to Unicorn master process (using i.e.
> DRB) its PID and match it against the PID value stored in the pidfile. Of
> course it would require some kind of communication with unicorn master process
> to get its PID, is it possible now in some way?
I don't see how being under a specific PID actually matters. Why not
just write a script that sends an HTTP request to check?
Workers will die soon after the first request, or (timeout/2) seconds if
a master dies anyways.
> > We avoid introducing command-line options since they're unlikely to be
> > compatible with "rackup" parsing of the "#\" lines in .ru files.
>
> I didn't know about such options in .ru file. Are those options
> supposed to be read by the backend?
I don't believe it's well-documented, I only found out from reading the
rackup code and I'm not really a fan of magic comments, but they're only
for the basic command-line arguments rackup handles:
$ rackup -h
Usage: rackup [ruby options] [rack options] [rackup config]
Ruby options:
-e, --eval LINE evaluate a LINE of code
-d, --debug set debugging flags (set $DEBUG to true)
-w, --warn turn warnings on for your script
-I, --include PATH specify $LOAD_PATH (may be used more than once)
-r, --require LIBRARY require the library, before executing your script
Rack options:
-s, --server SERVER serve using SERVER (webrick/mongrel)
-o, --host HOST listen on HOST (default: 0.0.0.0)
-p, --port PORT use PORT (default: 9292)
-E, --env ENVIRONMENT use ENVIRONMENT for defaults (default: development)
-D, --daemonize run daemonized in the background
-P, --pid FILE file to store PID (default: rack.pid)
Common options:
-h, --help Show this message
--version Show version
--
Eric Wong
_______________________________________________
Unicorn mailing list - mongrel-unicorn@rubyforge.org
http://rubyforge.org/mailman/listinfo/mongrel-unicorn
Do not quote signatures (like this one) or top post when replying
next prev parent reply other threads:[~2009-12-23 20:36 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-12-23 2:20 "unicorn -D" always returns 0 "success" (even when failed to load) Iñaki Baz Castillo
2009-12-23 7:26 ` Eric Wong
2009-12-23 10:22 ` Iñaki Baz Castillo
2009-12-23 20:35 ` Eric Wong [this message]
2009-12-24 9:30 ` Iñaki Baz Castillo
2009-12-24 19:34 ` Eric Wong
2009-12-25 22:09 ` Iñaki Baz Castillo
2009-12-26 1:30 ` Iñaki Baz Castillo
2009-12-25 23:58 ` Iñaki Baz Castillo
-- strict thread matches above, loose matches on Subject: below --
2009-12-26 4:29 Iñaki Baz Castillo
2009-12-26 6:16 ` Eric Wong
2009-12-26 15:47 ` Iñaki Baz Castillo
2009-12-26 18:23 ` Iñaki Baz Castillo
2009-12-27 1:31 ` Eric Wong
2009-12-27 3:06 ` Iñaki Baz Castillo
2009-12-27 3:07 ` Iñaki Baz Castillo
2009-12-28 3:29 ` Eric Wong
2009-12-28 10:39 ` Iñaki Baz Castillo
2009-12-28 12:50 ` Iñaki Baz Castillo
2009-12-28 19:25 ` Eric Wong
2009-12-28 20:17 ` Iñaki Baz Castillo
2009-12-28 20:32 ` Eric Wong
2009-12-28 20:41 ` Iñaki Baz Castillo
2009-12-29 0:17 ` Eric Wong
2009-12-29 0:32 ` Iñaki Baz Castillo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://yhbt.net/unicorn/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20091223203544.GB13735@dcvr.yhbt.net \
--to=normalperson@yhbt.net \
--cc=mongrel-unicorn@rubyforge.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhbt.net/unicorn.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).