[英]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根本沒有運行),則將調用處理程序。 請隨意閱讀自述文件以獲取更多詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.