Advertisement
DRVTiny

KemaFork.cr

May 7th, 2018
358
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.02 KB | None | 0 0
  1. require "kemal"
  2. require "logger"
  3.  
  4. log = Logger.new(STDERR)
  5. log.level = Logger::DEBUG
  6.  
  7. get "/" do
  8.   "Hello World! I am a process with pid #{Process.pid}"
  9. end
  10.  
  11. children_procs = [] of Process
  12. 16.times do
  13.     unless (child_p = Process.fork) # if we are forked child - run Kemal
  14.         log.info("I am a child process with pid #{Process.pid}")
  15.         Signal::TERM.trap do
  16.             log.warn("Process #{Process.pid} received TERM signal, so we have to emergency cleanup and exit now")
  17.             Kemal.stop
  18.             exit(0)
  19.         end
  20.         Kemal.run { |cfg| cfg.server.not_nil!.bind(reuse_port: true) }
  21.         log.error("[#{Process.pid}] Ooops. How is that possible?")
  22.         exit(1)
  23.     else
  24.         children_procs << child_p
  25.     end
  26. end
  27.  
  28. Signal::HUP.trap do
  29.     log.info("HUP received by master process #{Process.pid}. We have to terminate our children (by pid): [" + children_procs.map {|p| p.pid}.join(", ") + "]")
  30.    
  31.     children_procs.each do |child_p|
  32.         unless child_p.terminated?
  33.             child_pid = child_p.pid
  34.             log.debug("Sending signal TERM (15) to process #{child_pid}")
  35.             child_p.kill
  36.             unless child_p.terminated?
  37.                 spawn do
  38.                     count = 0
  39.                     until child_p.terminated? || (count += 1) >= 200
  40.                         sleep 0.01
  41.                         child_p.kill
  42.                     end
  43.                     unless child_p.terminated?
  44.                         log.error("Can't terminate child process ##{child_pid} for some unknown reason")
  45.                     end
  46.                 end
  47.                 child_p.wait
  48.             end
  49.         else
  50.             log.warn("Strange, but child process #{child_p.pid} seems to be already dead")
  51.         end
  52.         log.warn("Child ##{child_pid} was normaly terminated")
  53.     end
  54. end
  55. log.info("I am a main process with pid #{Process.pid}. Send me HUP signal to terminate Kemal server gracefully")
  56. children_procs.each { |child_p| child_p.terminated? || child_p.wait }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement