Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require "logger"
- TMPDIR = "/tmp/proc_respawn"
- Signal::USR1.trap do
- puts "parent(SIGUSR1): catched"
- end
- Signal::CHLD.trap do
- puts "parent(SIGCHLD): forked proc exited"
- end
- i = 0
- children = (1..5).map do |proc_n|
- puts "parent: spawn child ##{proc_n}"
- Process.fork do
- puts "child##{Process.pid}: starting"
- wait4file = "#{TMPDIR}/#{proc_n}"
- begin
- loop do
- if File.exists?(wait4file)
- puts "child##{Process.pid}: my file is here, so raising exception"
- raise ""
- end
- sleep 1
- end
- rescue
- File.delete(wait4file) if File.exists?(wait4file)
- Process.kill(Signal::USR1, Process.ppid)
- exit(1)
- end
- end
- end
- sgnl_sigexit_rcvd = Channel(Nil).new
- sgnl_sigchld_rcvd = Channel(Nil).new
- {% for sgnl in %w(HUP TERM INT) %}
- Signal::{{sgnl.id}}.trap do
- sgnl_sigexit_rcvd.send(nil)
- end
- {% end %}
- spawn do
- sgnl_sighup_rcvd.receive
- log = Logger.new(STDERR)
- log.level = Logger::DEBUG
- children.each do |child_p|
- child_pid = child_p.pid
- if child_p.terminated?
- log.warn( "Child ##{child_pid} already terminated" )
- else
- log.debug("Sending signal TERM (15) to process #{child_pid}")
- child_p.kill
- child_p.wait
- end
- log.error( "Cant terminate child ##{child_pid}" ) unless child_p.terminated?
- end
- end
- loop do
- sgnl_sigchld_rcvd.receive
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement