def maintain_workers
while @running
sleep 1
workers_to_replace = {}
@workers.each do |process_id, worker_params|
if result = Process.waitpid2(process_id, Process::WNOHANG)
log.error { "worker #{worker_params[:index]} (PID: #{process_id}) died with status #{result[1].exitstatus || '(no status)'}"}
workers_to_replace[process_id] = worker_params
end
end
workers_to_replace.each do |dead_pid, worker_params|
@workers.delete(dead_pid)
start_worker(worker_params[:index])
end
end
@workers.each do |pid, worker_params|
log.info { "Stopping worker #{worker_params[:index]} (PID: #{pid})"}
Process.kill(@kill, pid)
end
@workers.each do |pid, worker_params|
Process.waitpid2(pid)
end
end