2012-05-25 5 views
2

У меня есть приложение, которое использует resque для выполнения некоторых длительных заданий. Иногда требуется 8 часов или более для завершения.Узнайте, все еще запущено задание resque и убейте его, если оно застряло

В ситуациях, когда задание не удается, существует ли способ отслеживать самовоспроизведение, чтобы проверить, работает ли работа? Я знаю, что могу обновить статус задания в таблице базы данных (или самому redis), но я хочу знать, работает ли работа, поэтому я могу ее убить, если это необходимо.

конкретные вещи, которые мне нужно сделать это:

  • Определить, если работа по-прежнему работает
  • Определяют если работа остановлена ​​
  • Убейте рабочих мест, которые застряли

ответ

2

Resque github repository имеет этот секретный камень, задание god, которое будет делать именно это: следите за своими задачами и убивайте устаревшие.

https://github.com/resque/resque/blob/master/examples/god/stale.god

# This will ride alongside god and kill any rogue stale worker 
# processes. Their sacrifice is for the greater good. 

WORKER_TIMEOUT = 60 * 10 # 10 minutes 

Thread.new do 
    loop do 
    begin 
     `ps -e -o pid,command | grep [r]esque`.split("\n").each do |line| 
     parts = line.split(' ') 
     next if parts[-2] != "at" 
     started = parts[-1].to_i 
     elapsed = Time.now - Time.at(started) 

     if elapsed >= WORKER_TIMEOUT 
      ::Process.kill('USR1', parts[0].to_i) 
     end 
     end 
    rescue 
     # don't die because of stupid exceptions 
     nil 
    end 

    sleep 30 
    end 
end 
+0

Благодарим за это. Кажется очевидным, что это убьет задания, которые продлились через определенный период времени (хотя без определения того, застряла ли работа или просто обрабатывается). Работы, которые я выполняю, могут занимать от нескольких минут до 24 часов или больше часов в зависимости от базовых данных. –

+0

@KevinBedell: вы можете установить время ожидания до 36-48 часов, тогда :) –

+0

Да, это правда. Я думаю, мне нужно объединить это с тем, чтобы следить за ходом работы напрямую, чтобы я мог видеть, работает ли он еще. –

1

Решение бог заканчивает убивать рабочих, которые, возможно, не застряли или плохо. Я начал работать над решением этой проблемы, используя другой подход. Вы делаете все, что хотите, - регистрируйте обработчик (можете убивать, отправлять по электронной почте, отправлять оповещение пейджера и т. Д.), Когда возникают проблемы с рескей.

Если задание не обрабатывается в течение определенного периода времени (из-за того, что resque застревает, очередь имеет безумное отставание или resque просто не работает вообще), обработчик будет вызван. Не стесняйтесь выказывать на README для более подробной информации.

https://github.com/shaiguitar/resque_stuck_queue#readme

 Смежные вопросы

  • Нет связанных вопросов^_^