#!/usr/bin/env ruby # encoding: utf-8 # setup # require 'fileutils' script = File.expand_path(__FILE__).gsub(%r|\breleases/\d+\b|, 'current') script_dir = File.dirname(script) rails_root = File.dirname(script_dir) Dir.chdir(rails_root) require File.join(rails_root, 'config', 'env.rb') FileUtils.mkdir_p(File.join(rails_root, 'log', 'jobs')) FileUtils.touch(File.join(rails_root, 'log', 'jobs', 'pid')) %w( BACKGROUND PIDFILE QUEUE VVERBOSE INTERVAL COUNT ).each{|key| ENV.delete(key)} quiet = ARGV.delete('-q') || ARGV.delete('--quiet') mode = ARGV.shift || 'run' pidfile = './log/jobs/pid' pid = Integer(IO.read(pidfile).strip) rescue nil running = begin; Process.kill(0, pid); true; rescue Object; false; end # go # case mode when 'pid' puts(pid) if running when 'run' exit(42) unless DATA.flock(File::LOCK_EX | File::LOCK_NB) ENV['PIDFILE'] = pidfile ENV['QUEUE'] = 'jobs' ENV['VVERBOSE'] = '1' exec "rake environment resque:work" when 'start' exit(42) unless DATA.flock(File::LOCK_EX | File::LOCK_NB) unless running FileUtils.rm_f(pidfile) pid = nil a, b = IO.pipe if fork b.close pid = Integer(a.read.strip) a.close puts(pid) unless quiet exit end exit!(0) if fork a.close b.puts(Process.pid) b.close { 'stdin' => STDIN, 'stdout' => STDOUT, 'stderr' => STDERR, }.each do |basename, io| path = File.join("log/jobs/#{ basename }") begin open(path, 'a+'){|fd| io.reopen(fd)} rescue open(path, 'w+'){|fd| io.reopen(fd)} end end Process.setsid rescue nil File.umask(0) rescue nil # This is where Resque is started... # Looks like a good place to load and run a task that launches a workflow... ENV['PIDFILE'] = pidfile ENV['QUEUE'] = 'jobs' ENV['VVERBOSE'] = '1' if ENV['RAILS_ENV'] != 'production' exec "rake environment resque:work" end when 'stop' if running begin Process.kill('-QUIT', pid) rescue Errno::ESRCH nil end end when 'shutdown' if running alive = true %w( QUIT TERM ).each do |signal| begin Process.kill(signal, pid) rescue Errno::ESRCH nil end 42.times do begin alive = Process.kill(0, pid) sleep(1 + rand) if alive rescue Errno::ESRCH alive = false break end end break unless alive end if alive begin Process.kill(-9, pid) sleep(rand) rescue Errno::ESRCH nil end end end when 'restart' exit! if fork exit! if fork system "#{ script } shutdown -q >/dev/null 2>&1" exec "#{ script } start -q >/dev/null 2>&1" when 'tail' exec "tail -F ./log/jobs/*" when 'pstree' exec "pstree #{ pid }" if running end __END__