Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require "kemal"
- require "logger"
- log = Logger.new(STDERR)
- log.level = Logger::DEBUG
- get "/" do
- "Hello World! I am a process with pid #{Process.pid}"
- end
- children_procs = [] of Process
- 16.times do
- unless (child_p = Process.fork) # if we are forked child - run Kemal
- log.info("I am a child process with pid #{Process.pid}")
- Signal::TERM.trap do
- log.warn("Process #{Process.pid} received TERM signal, so we have to emergency cleanup and exit now")
- Kemal.stop
- exit(0)
- end
- Kemal.run { |cfg| cfg.server.not_nil!.bind(reuse_port: true) }
- log.error("[#{Process.pid}] Ooops. How is that possible?")
- exit(1)
- else
- children_procs << child_p
- end
- end
- Signal::HUP.trap do
- log.info("HUP received by master process #{Process.pid}. We have to terminate our children (by pid): [" + children_procs.map {|p| p.pid}.join(", ") + "]")
- children_procs.each do |child_p|
- unless child_p.terminated?
- child_pid = child_p.pid
- log.debug("Sending signal TERM (15) to process #{child_pid}")
- child_p.kill
- unless child_p.terminated?
- spawn do
- count = 0
- until child_p.terminated? || (count += 1) >= 200
- sleep 0.01
- child_p.kill
- end
- unless child_p.terminated?
- log.error("Can't terminate child process ##{child_pid} for some unknown reason")
- end
- end
- child_p.wait
- end
- else
- log.warn("Strange, but child process #{child_p.pid} seems to be already dead")
- end
- log.warn("Child ##{child_pid} was normaly terminated")
- end
- end
- log.info("I am a main process with pid #{Process.pid}. Send me HUP signal to terminate Kemal server gracefully")
- children_procs.each { |child_p| child_p.terminated? || child_p.wait }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement