[Mongrel] problem restarting mongrel_cluster outside RAILS_ROOT - patch and other option

Matte Edens matte at ruckuswireless.com
Tue Apr 17 15:27:31 EDT 2007

Sorry.  another long one.

Wayne, I used to use that actually.  And I even tried it last night, and 
today, before sending the email.  It didn't work using capistrano, or 
from anywhere that wasn't a rails_root location.  There's still a 
problem of where the command is run and where mongrel_cluster thinks 
it's looking for the pid files.  Here's how I see it happening...

1) we run "cap restart" on local machine where it logs in via ssh to 
execute remote commands
2) located in the /home/ssh_user directory, the remote commands run from 
3) restart runs a "stop/start" command sequence.  yes, I've been reading 
the discussion of using a -USR2 command, but for this discussion we 
ignore that until the bottom of this email.
4) "stop" line 101, reads the options
5) "read_options" line 28 calls "process_pid_file" to parse the pid_file 
6) "process_pid_file" sets up several variables for future use.

Here is where it breaks down with a relative path pid_file setting.  
None of the File.* commands are run from the cwd in that function.  
They're run from the /home/ssh_user directory.  Now I don't know about 
you but I don't run my applications from that directory.  Thus, with a 
setting of "log/mongrel.pid", the port_pid_file function returns 
"log/mongrel.8000.pid" and check_process is looking for 
/home/ssh_user/log/mongrel.8000.pid which obviously doesn't exist.  
Making a small change, that I am not suggesting is a fix, just 
temporary, I rewrote this line in process_pid_file (line 40).

@pid_file_dir = File.dirname("#{@options['cwd']}/#{pid_file}")

That's just a test to see if it would work with the addition of the 
cwd.  It worked of course, because now File.dirname had an absolute path 
to parse.

So, my suggestions from the first email, IMHO, are still valid.  Patch 
mongrel_cluster/init.rb to either ...

1) Change directories in "stop" and "start" before the check_process 
functions are called so that relative directories are handled correctly, 
(see my pastie) or
2) Change the process_pid_file function to handle relative directory 
pid_file settings by prepending the cwd setting.

or 3) have everyone change their mongrel_cluster config files to us 
absolute directory paths.  And, then there's the more recent discussion 
of changing the restart command to just call a -USR2 on mongrel_rails.

Personally, I'd like it to be fixed within mongrel_cluster so that it's 
just picked up by everyone when they update their gem.  And instead of 
asking everyone to put in a "after_after_deploy" capistrano task like 
Zed mentioned in this thread.  However, I just tried the following 
capistrano task...

task :restart do
  sudo "killall -USR2 mongrel_rails"

and got this error "No matching processes were found".  No idea about 
that except that when I "ps aux | grep mongrel_rails", each command 

/usr/local/bin/ruby18 /usr/local/bin/mongrel_rails start -d -e 
production -a -c /home/...

My linux_fu is not strong enough to know how to diagnose this last issue.


Wayne E. Seguin wrote:
> Matte,
> On Apr 17, 2007, at 00:09 , Matte Edens wrote:
>> "sudo mongrel_rails cluster::restart -C [valid path to config] -- 
>> clean"
> Is this really a problem with mongrel cluster?
> A "fourth" solution is to simply modify your restart task in your  
> Capistrano recipe:
> task :restart, :roles => :app do
>    run(or sudo) "cd #{current_path}; mongrel_rails cluster::restart - 
> C [valid path to config] --clean"
> end

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://rubyforge.org/pipermail/mongrel-users/attachments/20070417/2bef75ff/attachment.html 

More information about the Mongrel-users mailing list