Advertisement
DRVTiny

Control_Forks.cr

Oct 31st, 2018
313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.59 KB | None | 0 0
  1. require "logger"
  2. TMPDIR = "/tmp/proc_respawn"
  3. Signal::USR1.trap do
  4.         puts "parent(SIGUSR1): catched"
  5. end
  6.  
  7. Signal::CHLD.trap do
  8.         puts "parent(SIGCHLD): forked proc exited"
  9. end
  10.  
  11. i = 0
  12. children = (1..5).map do |proc_n|
  13.     puts "parent: spawn child ##{proc_n}"
  14.     Process.fork do
  15.         puts "child##{Process.pid}: starting"
  16.         wait4file = "#{TMPDIR}/#{proc_n}"
  17.         begin
  18.             loop do
  19.                 if File.exists?(wait4file)
  20.                     puts "child##{Process.pid}: my file is here, so raising exception"
  21.                     raise ""
  22.                 end
  23.                 sleep 1
  24.             end
  25.         rescue
  26.             File.delete(wait4file) if File.exists?(wait4file)
  27.             Process.kill(Signal::USR1, Process.ppid)
  28.             exit(1)
  29.         end
  30.     end
  31. end
  32.  
  33.  
  34. sgnl_sigexit_rcvd = Channel(Nil).new
  35. sgnl_sigchld_rcvd = Channel(Nil).new
  36.  
  37. {% for sgnl in %w(HUP TERM INT) %}
  38. Signal::{{sgnl.id}}.trap do
  39.         sgnl_sigexit_rcvd.send(nil)
  40. end
  41. {% end %}
  42.  
  43. spawn do
  44.     sgnl_sighup_rcvd.receive
  45.  
  46.     log = Logger.new(STDERR)
  47.     log.level = Logger::DEBUG
  48.  
  49.     children.each do |child_p|
  50.         child_pid = child_p.pid
  51.         if child_p.terminated?
  52.                 log.warn( "Child ##{child_pid} already terminated" )
  53.         else
  54.                 log.debug("Sending signal TERM (15) to process #{child_pid}")
  55.                 child_p.kill
  56.                 child_p.wait
  57.         end
  58.         log.error( "Cant terminate child ##{child_pid}" ) unless child_p.terminated?
  59.     end
  60. end
  61.  
  62. loop do
  63.         sgnl_sigchld_rcvd.receive
  64. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement