Skip to content

Instantly share code, notes, and snippets.

@denmarkin
Created June 22, 2011 15:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save denmarkin/1040395 to your computer and use it in GitHub Desktop.
Save denmarkin/1040395 to your computer and use it in GitHub Desktop.
monit + resque management (from @Mindwork)
#!/bin/sh
# wrapper to daemonize rake tasks: see also http://mmonit.com/wiki/Monit/FAQ#pidfile
usage() {
echo "usage: ${0} [start|stop] name target [arguments]"
echo "\tname is used to create or read the log and pid file names"
echo "\tfor start: target and arguments are passed to rake"
echo "\tfor stop: target and arguments are passed to kill (e.g.: -n 3)"
exit 1
}
[ $# -lt 2 ] && usage
cmd=$1
name=$2
shift ; shift
pid_file=./tmp/pids/${name}.pid
log_file=./log/${name}.log
case $cmd in
start)
if [ ${#} -eq 0 ] ; then
echo -e "\nERROR: missing target\n"
usage
fi
pid=`cat ${pid_file} 2> /dev/null`
if [ -n "${pid}" ] ; then
ps ${pid}
if [ $? -eq 0 ] ; then
echo "ensure process ${name} (pid: ${pid_file}) is not running"
exit 1
fi
fi
echo $$ > ${pid_file}
exec 2>&1 rake $* 1>> ${log_file} ;;
stop) pid=`cat ${pid_file} 2> /dev/null`
[ -n "${pid}" ] && kill $* ${pid}
rm -f ${pid_file} ;;
*) usage ;;
esac
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
require 'resque/tasks'
require 'resque_scheduler/tasks'
task "resque:setup" => :environment
namespace :resque do
desc 'start all background resque daemons'
task :start_daemons do
mrake_start "resque_scheduler resque:scheduler"
workers_config.each do |worker, config|
mrake_start "resque_#{worker} resque:work QUEUE=#{config['queues']} COUNT=#{config['count']}"
end
end
desc 'stop all background resque daemons'
task :stop_daemons do
sh "./script/monit_rake stop resque_scheduler"
workers_config.each do |worker, config|
sh "./script/monit_rake stop resque_#{worker} -s QUIT"
end
end
def self.workers_config
YAML.load(File.open(ENV['WORKER_YML'] || 'config/resque_workers.yml'))
end
def self.mrake_start(task)
environment = ENV['RAILS_ENV'] || 'production'
sh "nohup ./script/monit_rake start #{task} RAILS_ENV=#{environment} >> log/workers.log &"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment