resque スケジューラを使用しようとしていますが、プロセスを監視する良い方法が見つかりませんでした。私が望むのは、デプロイ後にスケジューラージョブを強制終了し、upstart
再起動させることです。resque-scheduler を強制終了する capistrano スクリプトを作成しました
task :stop_scheduler => :environment do
pidfile = Rails.root + "tmp/pids/resque_scheduler.pid"
if File.exists?(pidfile)
pid = File.read(pidfile).to_i
syscmd = "kill -s QUIT #{pid}"
puts "Running syscmd: #{syscmd}"
system(syscmd)
FileUtils.rm_f(pidfile)
else
puts "****WARNING**** Scheduler pid file has not been found. Was scheduler running??"
end
end
この時点で、upstart はそれを再起動します。私の問題はおそらくupstart confにあります。次回の再起動時に PID を強制終了できるようにするには、Schduler が tmp/pids/resque_scheduler.pid に PID を書き込む必要があります。
これが私のupstart confの重要な部分です:
respawn
respawn limit 99 5
console none
script
su -c "source 'cd /myapp/; RAILS_ENV={env} bundle exec rake resque:scheduler BACKGROUND=yes PIDFILE=./tmp/pids/resque_scheduler.pid >> ~/resque_workers.log 2>&1" my_user
end script
この種の conf を使用すると、スケジューラがもう一度フォークし、pidfile に書き込んだ pid が正しくないという効果があります。継続的にリスポーンし、もう殺すことができないプロセスで終了します。
なにか提案を?