module Glider::ProcessManager

Public Class Methods

children() click to toggle source

tracks forks/threads started as workers

# File lib/glider/process_manager.rb, line 10
def children
        @children ||= []
end
kill_children() click to toggle source
# File lib/glider/process_manager.rb, line 14
def kill_children
        if $leader_pid == Process.pid
                @end_monit = true
                children.each do |child|
                        begin 
                                pid, worker_proc = child
                                Process.kill('USR1', pid)
                        rescue Errno::ESRCH => e
                                # process already killed
                        end
                end
        end
end
monitor_children() click to toggle source
# File lib/glider/process_manager.rb, line 33
def monitor_children
        loop do
                break if @end_monit
                children.each_with_index do |child, index|
                        pid, worker_proc = child
                        begin
                                Process.kill 0, pid
                        rescue Errno::ESRCH
                                children.delete_at index
                                $logger.info "Restarting worker...."
                                start worker_proc
                        end
                end
                sleep 1
        end
        Glider::ProcessManager.kill_children
end
register_worker(worker_proc) click to toggle source
# File lib/glider/process_manager.rb, line 51
def register_worker(worker_proc)
        workers << worker_proc
end
start(worker_proc) click to toggle source
# File lib/glider/process_manager.rb, line 55
def start(worker_proc)
        pid = fork do
                worker_proc.call
        end
        children << [pid, worker_proc]
end
start_workers() click to toggle source
# File lib/glider/process_manager.rb, line 62
def start_workers
        $leader_pid ||= Process.pid
        Signal.trap('TERM') {Glider::ProcessManager.kill_children}
        Signal.trap('INT') {Glider::ProcessManager.kill_children}
        # todo start workers as forks
        @workers.each do |worker_proc|
                start worker_proc
        end
        Thread.new do
                monitor_children
        end
        Process.waitall
end
workers() click to toggle source
# File lib/glider/process_manager.rb, line 28
def workers
        @workers ||= []
end