Skip to content

Instantly share code, notes, and snippets.

@hone
Created July 27, 2012 22:17
Show Gist options
  • Select an option

  • Save hone/3190730 to your computer and use it in GitHub Desktop.

Select an option

Save hone/3190730 to your computer and use it in GitHub Desktop.
RUN_TIME = 10
RESCUE_TIME = 3
TERM_WAIT_TIME = 7
TERMFILE = "term.txt"
class Job
def self.perform(run_time, rescue_time)
sleep(run_time)
puts "Processed job!"
rescue SignalException => e
sleep rescue_time
File.open(TERMFILE, 'w') do |file|
file.puts "Caught Signal Exception: #{e.message}"
end
end
end
class Worker
def self.work(term_timeout)
@shutdown = false
trap('TERM') do
if @child && !Process.waitpid(@child, Process::WNOHANG)
Process.kill("TERM", @child)
(term_timeout.to_f * 10).round.times do |i|
sleep(0.1)
return if Process.waitpid(@child, Process::WNOHANG)
end
Process.kill("KILL", @child)
end
end
loop do
break if @shutdown
if @child = fork
begin
Process.waitpid(@child)
@shutdown = true
rescue SystemCallError
nil
end
else
trap('TERM', 'DEFAULT')
Job.perform(RUN_TIME, RESCUE_TIME)
@shutdown = true
end
@child = nil
end
end
end
if $0 == __FILE__
require 'fileutils'
FileUtils.rm(TERMFILE) if File.exists?(TERMFILE)
pid = Kernel.fork do
Worker.work(TERM_WAIT_TIME)
end
sleep(1)
Process.kill("TERM", pid)
Process.waitpid(pid)
if File.exists?(TERMFILE) && File.read(TERMFILE).match(/Caught Signal Exception/)
puts 'SUCCESS!'
else
puts 'FAILURE'
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment