Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save gruis/4742596 to your computer and use it in GitHub Desktop.
Save gruis/4742596 to your computer and use it in GitHub Desktop.
require 'rubygems'
require 'eventmachine'
children = []
Signal.trap('SIGINT') do
EventMachine.next_tick { EventMachine.stop_event_loop }
end
Signal.trap('EXIT') do
puts "Killing #{children.size} children ..."
children.each do |pid|
Process.kill('SIGUSR1', pid) rescue Exception
end
end
module Connection
def receive_data(data)
puts "\t#{data}"
end
end
pipe = IO.pipe
EventMachine.run do
puts "Father PID: #{Process.pid}"
read = EventMachine.attach(pipe[0], Connection)
EventMachine.add_periodic_timer(1) do
puts "Father(#{Process.pid}): #{Time.now.to_s}"
end
4.times do |i|
pid = EventMachine.fork_reactor do
read.close_connection
write = EventMachine.attach(pipe[1])
Signal.trap('SIGUSR1') { EventMachine.stop_event_loop }
Signal.trap('SIGCHLD') {}
Signal.trap('EXIT') {}
EventMachine.add_periodic_timer(5) do
write.send_data "Child[#{i}](#{Process.pid}): #{Time.now.to_s}"
end
end
children << pid
puts "Child[#{i}] PID: #{pid}"
Process.detach(pid)
end
end
@chergik
Copy link

chergik commented Feb 13, 2013

On SIGINT after "stop_event_loop" you should do

children.each do |pid|
Process.kill('SIGUSR1', pid) rescue Exception
end

as in "EXIT". In other case you will see child processes in ps aux after parent gone. Hate zombie.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment