Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

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
  • Loading branch information...
commit da3eae49227f7cd5d7fd8bde2273d860ef90ac9d 1 parent 4c7dcb5
@jamis jamis authored
Showing with 26 additions and 10 deletions.
  1. +2 −0  railties/CHANGELOG
  2. +24 −10 railties/lib/commands/process/reaper.rb
View
2  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]
View
34 railties/lib/commands/process/reaper.rb
@@ -11,8 +11,8 @@ class << self
# 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 @@ def usr1(pid)
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 @@ def terminating?(action)
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 @@ def pid_files
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 @@ def pid_files
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 @@ def pid_files
opts.parse!
end
-Killer.process(OPTIONS[:action], OPTIONS[:pid_path], OPTIONS[:pattern])
+Killer.process(OPTIONS[:action], OPTIONS[:pid_path], OPTIONS[:pattern], OPTIONS[:dispatcher])
Please sign in to comment.
Something went wrong with that request. Please try again.