Pidfiles and cwd?

Chris Wanstrath chris at
Sat Sep 5 20:50:17 EDT 2009

On Fri, Sep 4, 2009 at 9:28 PM, Eric Wong<normalperson at> wrote:

>> A) Is there a reason `unicorn` allows you to specify the pidfile's
>> location but `unicorn_rails` does not?
> `unicorn` was designed to mimic `rackup` in terms of command line
> options and `unicorn_rails` was designed to mimic `script/server` in
> Rails.
> I really didn't know what I was doing with the command-line options for
> this, so I decided to steal from others :)
> For long-running servers, I'm not a fan of command-line options in
> general because they're easy to forget, so `unicorn` only supports it
> because `rackup` does it (so the embedded CLI options in can
> be shared).
> For `unicorn_rails`, --daemonize already sets a default PID path in
> RAILS_ROOT/tmp/pids/ whereas `script/server` chooses
> RAILS_ROOT/tmp/pids/  Since Rails values "convention over
> configuration",  I figured I might as well hard code it...
> Additionally, the "-P" parameter used by unicorn_rails and script/server
> is used to set RAILS_RELATIVE_URL_ROOT so it conflicts with the short
> option used by rackup/unicorn.

I'm 100% on board with your reasoning here, but I don't understand why
we can't set the pid in the config file. Am I reading this wrong?
(Very possibly.)

Doesn't this line mean that any `pid` setting in the configurator is ignored:

If so, how would you suggest setting the pid at runtime? I don't mean
to be difficult, we just want to keep everything in /var/run

>> B) Is there a reason `unicorn_rails` must start in the app root and
>> doesn't allow it as a config option?
> Since the config file is just Ruby, you can just Dir.chdir inside it.
> And since the chdir is done when the config file is evaluated, the
> chdir can be done across restarts/reloads (you can point it to a
> symlinked directory) to pick up new code/releases.
> If you do that, I would initially start Unicorn in "/" or some other
> directory that won't get deleted so you'll be safe for upgrades.
> If you managed to forget that, you can set the following in your
> Unicorn config:
>  Unicorn::HttpServer::START_CTX[:cwd] = "/"
> And then HUP the process before doing the USR2+QUIT to reexec.
> Subsequent Unicorns will always start in "/" and then you can
> Dir.chdir to wherever you run your app.
> Hopefully that makes sense, one thing I've been trying to avoid with the
> configuration is having too many ways to do the same thing.

Sounds good to me. Unicorn has quite completely convinced me that
pure-Ruby config files are the way to go. I've already done some crazy
stuff in there during our migration that a YAML file (or whatever)
just wouldn't have been able to handle.


Chris Wanstrath

More information about the mongrel-unicorn mailing list