Revert "Merge pull request #176 from rtyler/feature/156-foreman-stop-command"
Rewriting using a better Process API This reverts commitdbe51832b0, reversing changes made to69216b4c5e.
This commit is contained in:
+1
-1
@@ -30,7 +30,7 @@ class Foreman::CLI < Thor
|
||||
def start(process=nil)
|
||||
check_procfile!
|
||||
engine.options[:concurrency] = "#{process}=1" if process
|
||||
engine.run
|
||||
engine.start
|
||||
end
|
||||
|
||||
desc "export FORMAT LOCATION", "Export the application to another process management format"
|
||||
|
||||
+31
-45
@@ -28,7 +28,7 @@ class Foreman::Engine
|
||||
@output_mutex = Mutex.new
|
||||
end
|
||||
|
||||
def run
|
||||
def start
|
||||
proctitle "ruby: foreman master"
|
||||
termtitle "#{File.basename(@directory)} - foreman"
|
||||
|
||||
@@ -36,49 +36,9 @@ class Foreman::Engine
|
||||
trap("INT") { puts "SIGINT received"; terminate_gracefully }
|
||||
|
||||
assign_colors
|
||||
start
|
||||
spawn_processes
|
||||
watch_for_output
|
||||
watch_for_termination
|
||||
terminate_gracefully
|
||||
end
|
||||
|
||||
def start(name=nil)
|
||||
concurrency = Foreman::Utils.parse_concurrency(@options[:concurrency])
|
||||
|
||||
procfile.entries.each do |entry|
|
||||
unless name == nil
|
||||
next unless entry.name == name
|
||||
end
|
||||
|
||||
reader, writer = (IO.method(:pipe).arity == 0 ? IO.pipe : IO.pipe("BINARY"))
|
||||
entry.spawn(concurrency[entry.name], writer, @directory, @environment, port_for(entry, 1, base_port)).each do |process|
|
||||
running_processes[process.pid] = process
|
||||
readers[process] = reader
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def stop(name=nil, signal='SIGTERM')
|
||||
running_processes.each do |pid, process|
|
||||
unless name == ALL_PROCESSES
|
||||
# Comparing against process.entry.name instead of process.name to
|
||||
# make sure we match the process name exactly for any/all
|
||||
# concurrently running processes by this name
|
||||
next unless process.entry.name == name
|
||||
else
|
||||
info "sending #{signal} to all processes"
|
||||
end
|
||||
|
||||
process.kill signal
|
||||
process = running_processes.delete(pid)
|
||||
Timeout.timeout(5) do
|
||||
begin
|
||||
Process.waitpid(pid)
|
||||
info "process terminated", process.name
|
||||
rescue Errno::ECHILD
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def port_for(process, num, base_port=nil)
|
||||
@@ -93,19 +53,44 @@ class Foreman::Engine
|
||||
|
||||
private ######################################################################
|
||||
|
||||
def spawn_processes
|
||||
concurrency = Foreman::Utils.parse_concurrency(@options[:concurrency])
|
||||
|
||||
procfile.entries.each do |entry|
|
||||
reader, writer = (IO.method(:pipe).arity == 0 ? IO.pipe : IO.pipe("BINARY"))
|
||||
entry.spawn(concurrency[entry.name], writer, @directory, @environment, port_for(entry, 1, base_port)).each do |process|
|
||||
running_processes[process.pid] = process
|
||||
readers[process] = reader
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def base_port
|
||||
options[:port] || 5000
|
||||
end
|
||||
|
||||
def kill_all(signal="SIGTERM")
|
||||
running_processes.each do |pid, process|
|
||||
info "sending #{signal} to pid #{pid}"
|
||||
process.kill signal
|
||||
end
|
||||
end
|
||||
|
||||
def terminate_gracefully
|
||||
return if @terminating
|
||||
@terminating = true
|
||||
info "sending SIGTERM to all processes"
|
||||
kill_all "SIGTERM"
|
||||
Timeout.timeout(5) do
|
||||
stop
|
||||
while running_processes.length > 0
|
||||
pid, status = Process.wait2
|
||||
process = running_processes.delete(pid)
|
||||
info "process terminated", process.name
|
||||
end
|
||||
end
|
||||
rescue Timeout::Error
|
||||
stop(nil, 'SIGKILL')
|
||||
rescue Errno::ECHILD
|
||||
info "sending SIGKILL to all processes"
|
||||
kill_all "SIGKILL"
|
||||
end
|
||||
|
||||
def poll_readers
|
||||
@@ -138,6 +123,7 @@ private ######################################################################
|
||||
pid, status = Process.wait2
|
||||
process = running_processes.delete(pid)
|
||||
info "process terminated", process.name
|
||||
terminate_gracefully
|
||||
rescue Errno::ECHILD
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user