[Mongrel] problem restarting mongrel_cluster outside RAILS_ROOT - patch and other option
Matte Edens
matte at ruckuswireless.com
Tue Apr 17 00:09:45 EDT 2007
Hey folks. Sorry for the SUPER long email but if you've been
experiencing the same problems with restarting your mongrel cluster with
Capistrano, then I have two solutions that have worked for me and I'm
pretty sure will for you as well.
THE PROBLEM
I was having trouble restarting my clusters using Capistrano. I've seen
this come up before on the mailing list and looking through the archive
I haven't been able to find a suitable answer or fix.
All my machines are updated to the latest mongrel and mongrel_cluster
gems. 1.0.1 and 1.0.1.1 respectively. Running a "cap restart" runs the
correct command to restart the cluster (edited for brevity) ...
"sudo mongrel_rails cluster::restart -C [valid path to config] --clean"
This works when you are sitting in your rails app root, however,
Capistrano runs it's commands from the ssh user's home directory. I ran
that same command from there and I got this dreaded error output.
/*** begin err output ***/
already stopped port 8000
already stopped port 8001
starting port 8000
!!! PID file log/mongrel.8000.pid already exists. Mongrel could be
running already. Check your log/mongrel.8000.log for errors.
!!! Exiting with error. You must stop mongrel and clear the .pid before
I'll attempt a start.
starting port 8001
!!! PID file log/mongrel.8001.pid already exists. Mongrel could be
running already. Check your log/mongrel.8001.log for errors.
!!! Exiting with error. You must stop mongrel and clear the .pid before
I'll attempt a start.
/*** end err output ***/
What was brought up earlier [1] was that it appears that mongrel is not
changing the working directory to the one specified in the config file.
A patch was submitted [2] but by my reckoning, has not been applied and
released.
However, I believe the patch mentioned above may not be necessary
because according to my research, the problem isn't with mongrel at
all. It's with mongrel_cluster, no offense Bradley. :) I've found two
issues. One I believe causes the other.
1) The basic problem is that the "start" and "stop" commands, when they
are scanning for existing pid files, are not being run from the working
directory, as specified by the :cwd setting in the mongrel_cluster
config file. mongrel_cluster does not use the working directory setting
until it is past that point and finally calling the mongrel_rails
command. Thus, it isn't going to find the pid files if you are also
susceptible to problem #2.
2) A relative directory :pid_file setting in the mongrel_cluster
config. If you're like me, your :pid_file setting is
"log/mongrel.pid". Using a relative directory like that is supposed to
be based on the value of the :cwd setting. But mongrel_cluster is not
applying the :cwd setting when parsing the :pid_file setting for it's
internal pid file variables.
SOLUTIONS... FINALLY!! :)
1) The solution to the first problem is to patch
mongrel_cluster/init.rb. Add some directory change commands, like the
"status" command uses. I've uploaded my patch to Pastie at the address
below.
<http://pastie.caboo.se/54340>
2) Don't use relative directories for the pid_file setting. Once I
changed to an absolute directory setting of, for example,
"/www/app/shared/log/mongrel.pid" then mongrel_cluster correctly found
my pid files. Solution #1 is NOT needed in this instance.
Both solutions require the user to perform an action but I believe that
the first solution requires less steps for the end user. Instead of
updating ALL of your mongrel_cluster config files, for every single app
you're running, just update to the patched mongrel_cluster.
I suppose there's a THIRD solution and that's to patch the
"read_options" function in init.rb. Lines 28 and 29 need to be updated
to prepend @options["cwd"] if @options["pid_file"] or
@options["log_file"] are relative paths.
Am I off base with all this? Let me know. And thanx for reading all
the way to the end. :)
matte - matte at silent-e.com
1: <http://rubyforge.org/pipermail/mongrel-users/2007-March/003341.html>
2: <http://rubyforge.org/pipermail/mongrel-users/2007-March/003343.html>
More information about the Mongrel-users
mailing list