답변:
이 솔루션 중 어느 것도 나를 위해 일한 적이 없으며 redis-web에서 여전히 볼 수 있습니다.
0 out of 10 Workers Working
마지막으로 모든 작업자를 지우는 데 도움이되었습니다.
Resque.workers.each {|w| w.unregister_worker}
heroku restart
트릭을 수행하는 것처럼 보였습니다. 이제 올바른 작업자 수를 보여줍니다.
Resque.workers.each {|w| matches = w.id.match(/^[^:]*:([0-9]*):[^:]*$/); pid = matches[1]; w.unregister_worker unless w.worker_pids.include?(pid.to_s)}
만 등록 취소 하려는 경우 pid가 알려진 실행중인 pid의 일부가 아닌 작업자 만 등록 취소 하려고 할 수 있습니다 . 이것이 모든 환경에서 작동하는지 모르겠지만 우분투에서는 잘 작동합니다. 이것은 작업자가이 코드를 실행하는 동일한 컴퓨터에있을 때만 작동 할 수 있습니다.
unregister_worker
? 이것을 결정할 방법이 있습니까?
콘솔에서 :
queue_name = "process_numbers"
Resque.redis.del "queue:#{queue_name}"
그렇지 않으면 다음과 같이 제거하기 위해 가짜로 시도 할 수 있습니다.
Resque::Worker.working.each {|w| w.done_working}
편집하다
많은 사람들 이이 답변을 찬성했으며 사람들이 대기열에서 작업자를 등록 취소하는 hagope의 솔루션을 시도하는 것이 중요하다고 생각하지만 위의 코드는 대기열을 삭제합니다. 당신이 그들을 가짜로 기뻐한다면, 시원하십시오.
resque gem이 설치되어 있으므로 콘솔을 열고 현재 작업자를 얻을 수 있습니다.
Resque.workers
작업자 목록을 반환합니다.
#=> [#<Worker infusion.local:40194-0:JAVA_DYNAMIC_QUEUES,index_migrator,converter,extractor>]
작업자를 선택하고 prune_dead_workers
예를 들어 첫 번째
Resque.workers.first.prune_dead_workers
hagope의 답변에 덧붙여서, 나는 일정 시간 동안 달리고 있던 근로자 만 등록을 취소하고 싶었습니다. 아래 코드는 300 초 (5 분) 이상 근무하는 근로자 만 등록을 취소합니다.
Resque.workers.each {|w| w.unregister_worker if w.processing['run_at'] && Time.now - w.processing['run_at'].to_time > 300}
https://gist.github.com/ewherrmann/8809350에 추가 한 Resque 관련 Rake 작업 컬렉션이 진행 중입니다.
서버를 시작하기 위해 명령을 실행할 때마다이 명령을 실행하십시오.
$ ps -e -o pid,command | grep [r]esque
다음과 같이 보일 것입니다 :
92102 resque: Processing ProcessNumbers since 1253142769
내 예제에서 PID (프로세스 ID)를 기록하십시오.
그런 다음 두 가지 방법 중 하나의 프로세스를 종료 할 수 있습니다.
정상적으로 사용 QUIT 92102
강제 사용 TERM 92102
* 구문이 확실하지 QUIT 92102
않거나QUIT -92102
문제가 있으면 알려주세요.
난 그냥했다:
% rails c production
irb(main):001:0>Resque.workers
근로자 명단을 찾았습니다.
irb(main):002:0>Resque.remove_worker(Resque.workers[n].id)
... 여기서 n은 원치 않는 작업자의 인덱스 (0부터 시작)입니다.
나는이 문제에 부딪 치고 여기에서 많은 제안을 이행하는 길을 시작했다. 그러나이 문제를 일으키는 근본 원인 은 gem redis-rb 3.3.0을 사용하고 있다는 것 입니다. redis-rb 3.2.2로 다운 그레이드하면 이러한 작업자가 처음부터 고착되는 것을 방지 할 수있었습니다.
최근 https://github.com/shaiguitar/resque_stuck_queue/에서 작업을 시작했습니다 . 갇힌 작업자를 수정하는 방법에 대한 솔루션은 아니지만 resque hang / 걸린 문제를 해결 하므로이 스레드의 사람들에게 도움이 될 수 있다고 생각했습니다. README에서 :
"resque가 특정 기간 내에 작업을 실행하지 않으면 미리 정의 된 처리기가 트리거됩니다.이를 사용하여 이메일, 호출기 의무, 추가 resque 작업자 추가, resque 다시 시작, txt 전송에 사용할 수 있습니다. .. 무엇이든 당신에게 어울립니다. "
생산에 사용되어 왔으며 지금까지 꽤 잘 작동합니다.
나는 노동자가 실제로 거기에 있고 잘 달리고 있기 때문에 여기에 갇힌 / 이야기를 잘 짜는 노동자 들이나 '잡스'라고 말해야하는 것은 붙어있는 갈래 과정입니다.
나는 bash 스크립트를 통해 5 분 이상 동안 포크 프로세스 "Processing"을 죽이는 잔인한 해결책을 선택했다. 그러면 작업자는 다음 줄을 큐에 스폰하고 모든 것이 계속 진행된다.
내 스크립트를 살펴보십시오 : https://gist.github.com/jobwat/5712437
redis-cli에서 직접 삭제했습니다. 운 좋게 redistogo.com은 heroku 외부 환경에서 액세스 할 수 있습니다. 목록에서 죽은 작업자 ID를 가져옵니다. 광산은
55ba6f3b-9287-4f81-987a-4e8ae7f51210:2
이 명령을 redis에서 직접 실행하십시오.
del "resque:worker:55ba6f3b-9287-4f81-987a-4e8ae7f51210:2:*"
redis db를 모니터링하여 무대 뒤에서 무엇을하고 있는지 확인할 수 있습니다.
redis xxx.redistogo.com> MONITOR
OK
1380274567.540613 "MONITOR"
1380274568.345198 "incrby" "resque:stat:processed" "1"
1380274568.346898 "incrby" "resque:stat:processed:c65c8e2b-555a-4a57-aaa6-477b27d6452d:2:*" "1"
1380274568.346920 "del" "resque:worker:c65c8e2b-555a-4a57-aaa6-477b27d6452d:2:*"
1380274568.348803 "smembers" "resque:queues"
두 번째 마지막 줄은 작업자를 삭제합니다.