diff options
author | Jamis Buck <jamis@37signals.com> | 2006-11-11 22:46:00 +0000 |
---|---|---|
committer | Jamis Buck <jamis@37signals.com> | 2006-11-11 22:46:00 +0000 |
commit | da3eae49227f7cd5d7fd8bde2273d860ef90ac9d (patch) | |
tree | b06723935be23a8f774d3c13f550e8a4b1f6b227 /railties | |
parent | 4c7dcb5dbf2950c39e2caa99e33d4807a0a327aa (diff) | |
download | rails-da3eae49227f7cd5d7fd8bde2273d860ef90ac9d.tar.gz rails-da3eae49227f7cd5d7fd8bde2273d860ef90ac9d.tar.bz2 rails-da3eae49227f7cd5d7fd8bde2273d860ef90ac9d.zip |
Add grep-based fallback to reaper, so it can work in pidless setups (again)
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@5488 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'railties')
-rw-r--r-- | railties/CHANGELOG | 2 | ||||
-rw-r--r-- | railties/lib/commands/process/reaper.rb | 34 |
2 files changed, 26 insertions, 10 deletions
diff --git a/railties/CHANGELOG b/railties/CHANGELOG index 7d85669992..e2659c9051 100644 --- a/railties/CHANGELOG +++ b/railties/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Add grep-based fallback to reaper, to work in pidless setups [Jamis Buck] + * Only wrap request processing with our USR1 signal handler so FastCGI can trap it and raise an exception while waiting for connections. Idle processes exit immediately rather than waiting for another request; active processes gracefully exit when the request is finished. [Jeremy Kemper] * Alter prior change to use require_dependency instead of require_or_load. Causes ApplicationController to be reloaded again. Closes #6587. [Nicholas Seckar] diff --git a/railties/lib/commands/process/reaper.rb b/railties/lib/commands/process/reaper.rb index 0790cfcce9..4402b57faf 100644 --- a/railties/lib/commands/process/reaper.rb +++ b/railties/lib/commands/process/reaper.rb @@ -11,8 +11,8 @@ class Killer # set of processes: # # Killer.process(:reload, "/tmp/pids", "dispatcher.*.pid") - def process(action, pid_path, pattern) - new(pid_path, pattern).process(action) + def process(action, pid_path, pattern, keyword) + new(pid_path, pattern, keyword).process(action) end # Forces the (rails) application to reload by sending a +HUP+ signal to the @@ -45,15 +45,16 @@ class Killer end end - def initialize(pid_path, pattern) - @pid_path, @pattern = pid_path, pattern + def initialize(pid_path, pattern, keyword=nil) + @pid_path, @pattern, @keyword = pid_path, pattern, keyword end def process(action) pids = find_processes if pids.empty? - puts "Couldn't find any pid file in '#{@pid_path}' matching '#{@pattern}'" + warn "Couldn't find any pid file in '#{@pid_path}' matching '#{@pattern}'" + warn "(also looked for processes matching #{@keyword.inspect})" if @keyword else pids.each do |pid| puts "#{action.capitalize}ing #{pid}" @@ -70,7 +71,18 @@ class Killer end def find_processes - pid_files.collect { |pid_file| File.read(pid_file).to_i } + files = pid_files + if files.empty? + find_processes_via_grep + else + files.collect { |pid_file| File.read(pid_file).to_i } + end + end + + def find_processes_via_grep + lines = `ps axww -o 'pid command' | grep #{@keyword}`.split(/\n/). + reject { |line| line =~ /inq|ps axww|grep|spawn-fcgi|spawner|reaper/ } + lines.map { |line| line[/^\s*(\d+)/, 1].to_i } end def delete_pid_files @@ -84,9 +96,10 @@ end OPTIONS = { - :action => "restart", - :pid_path => File.expand_path(RAILS_ROOT + '/tmp/pids'), - :pattern => "dispatch.[0-9]*.pid" + :action => "restart", + :pid_path => File.expand_path(RAILS_ROOT + '/tmp/pids'), + :pattern => "dispatch.[0-9]*.pid", + :dispatcher => File.expand_path("#{RAILS_ROOT}/public/dispatch.fcgi") } ARGV.options do |opts| @@ -124,6 +137,7 @@ ARGV.options do |opts| opts.on("-a", "--action=name", "reload|graceful|kill (default: #{OPTIONS[:action]})", String) { |v| OPTIONS[:action] = v } opts.on("-p", "--pidpath=path", "default: #{OPTIONS[:pid_path]}", String) { |v| OPTIONS[:pid_path] = v } opts.on("-r", "--pattern=pattern", "default: #{OPTIONS[:pattern]}", String) { |v| OPTIONS[:pattern] = v } + opts.on("-d", "--dispatcher=path", "DEPRECATED. default: #{OPTIONS[:dispatcher]}", String) { |v| OPTIONS[:dispatcher] = v } opts.separator "" @@ -132,4 +146,4 @@ ARGV.options do |opts| opts.parse! end -Killer.process(OPTIONS[:action], OPTIONS[:pid_path], OPTIONS[:pattern]) +Killer.process(OPTIONS[:action], OPTIONS[:pid_path], OPTIONS[:pattern], OPTIONS[:dispatcher]) |