2012-05-25 4 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가 멈췄거나 대기열에 미친 백 로그가 있거나 resque가 전혀 실행되지 않아서 작업이 특정 기간 동안 처리되지 않으면 처리기가 호출됩니다. 자세한 내용은 README를 읽어보십시오.

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

관련 문제