У меня есть приложение Rails, которое запускает задания в фоновом режиме с помощью адаптера Resque. Я заметил, что раз в пару дней мои работники исчезают (просто останавливаются), мои работы застряли в очереди, и мне приходится перезапускать работников каждый раз, когда они останавливаются.
Я проверяю, используя ps -e -o pid,command | grep [r]esque
, и запускаю рабочих в фоновом режиме, используя
(RAILS_ENV=production PIDFILE=./resque.pid BACKGROUND=yes bundle exec rake resque:workers QUEUE='*' COUNT='12') 2>&1 | tee -a log/resque.log
.
Затем я остановил редис-сервер с помощью /etc/init.d/redis-server stop
и снова проверил рабочие процессы. Они исчезли
Это дает основание полагать, что рабочие процессы могут быть остановлены, возможно, из-за перезапуска сервера redis по какой-то причине.
Есть ли способ решения этой проблемы с помощью Rails / Ruby? Мне приходит в голову написать простой код Ruby, который будет наблюдать за рабочими процессами с периодом, скажем, 5 секунд, и перезапускать их, если они остановятся.
UPDATE:
Я не хочу использовать такие инструменты, как Monit, God, eye и т. Д. Они ненадежны. Тогда мне нужно будет их тоже посмотреть. Что-то вроде установки Бога для управления работниками Resque, затем установки Monit для наблюдения за Богом, ...
UPDTAE
Это то, что я использую, и это действительно работает. Я вручную остановил редис-сервер и снова запустил его. Этот скрипт успешно запущен рабочими.
require 'logger'
module Watch
def self.workers_dead?
processes = `ps -e -o pid,command | grep [r]esque`
return true if processes.empty?
false
end
def self.check(time_interval)
logger = Logger.new('watch.log', 'daily')
logger.info("Starting watch")
while(true) do
if workers_dead?
logger.warn("Workers are dead")
restart_workers(logger)
end
sleep(time_interval)
end
end
def self.restart_workers(logger)
logger.info("Restarting workers...")
`cd /var/www/agts-api && (RAILS_ENV=production PIDFILE=./resque.pid BACKGROUND=yes rake resque:workers QUEUE='*' COUNT='12') 2>&1 | tee -a log/resque.log`
end
end
Process.daemon(true,true)
pid_file = File.dirname(__FILE__) + "#{__FILE__}.pid"
File.open(pid_file, 'w') { |f| f.write Process.pid }
Watch.check 10