簡體   English   中英

查明是否有待處理的作業仍在運行,如果卡住了,則將其殺死

[英]Find out if a resque job is still running and kill it if it's stuck

我有一個使用resque來運行一些長時間運行的作業的應用程序。 有時需要8個小時或更長時間才能完成。

在作業失敗的情況下,是否可以監視自身的響應狀態以查看作業是否正在運行? 我知道我可以在數據庫表(或Redis本身)中更新作業的狀態,但是我想知道該作業是否仍在運行,因此可以在必要時將其終止。

我需要做的具體事情是:

  • 確定作業是否仍在運行
  • 確定作業是否停止
  • 殺死卡住的工作

Resque github存儲庫中有一個秘密的寶石,這是一個神的任務,它將完全做到這一點:觀察您的任務並殺死陳舊的任務。

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

上帝的解決方案最終殺死了可能根本沒有被卡住或壞透的工人。 我也開始通過另一種方法來解決這個問題。 您可以做任何您想做的事情-當出現任何問題時,注冊一個處理程序(可以殺死,發送電子郵件,發送尋呼機警報等)。

如果某個作業在特定時間段內未得到處理(由於resque被卡住,隊列中有大量積壓的工作,或者resque根本沒有運行),則將調用處理程序。 請隨意閱讀自述文件以獲取更多詳細信息。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM