-
-
Save eric/3124469 to your computer and use it in GitHub Desktop.
./script/jobs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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) | |
exit!(0) if fork | |
exit! if fork | |
puts(Process.pid) unless quiet | |
Process.setsid rescue nil | |
File.umask(0) rescue nil | |
{ | |
'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 | |
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) | |
rescue Errno::ESRCH | |
nil | |
end | |
end | |
end | |
when 'restart' | |
system "#{ script } shutdown -q >/dev/null 2>&1" | |
exit!(0) if fork | |
exec "#{ script } start -q >/dev/null 2>&1" | |
when 'tail' | |
exec "tail -F ./log/jobs/*" | |
when 'pstree' | |
exec "pstree #{ pid }" if running | |
end | |
__END__ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment