고착 된 / 사실적인 Resque 작업자를 지우려면 어떻게해야합니까?


132

첨부 된 이미지에서 볼 수 있듯이 갇힌 것처럼 보이는 두 명의 작업자가 있습니다. 이러한 프로세스는 몇 초 이상 걸리지 않아야합니다.

여기에 이미지 설명을 입력하십시오

왜 투명하지 않은지 또는 수동으로 제거하는 방법을 모르겠습니다.

Redis-to-Go 및 HireFire와 함께 Resque를 사용하여 자동으로 작업자의 규모를 조정하는 Heroku를 사용하고 있습니다.


2
반 관련 질문 : heroku를 통해 resque-web 대시 보드를 어떻게 얻었습니까? 나는 그것을 여는 방법을 알아낼 수없는 것 같습니다.
Aaron Marks

답변:


215

이 솔루션 중 어느 것도 나를 위해 일한 적이 없으며 redis-web에서 여전히 볼 수 있습니다.

0 out of 10 Workers Working

마지막으로 모든 작업자를 지우는 데 도움이되었습니다.

Resque.workers.each {|w| w.unregister_worker}

12
이것은 나를 위해 일했습니다. 그것은 약간 성가신 모든 근로자를 등록 취소했습니다 . 그러나 이것은 heroku restart트릭을 수행하는 것처럼 보였습니다. 이제 올바른 작업자 수를 보여줍니다.
Brian Armstrong

이것은 웹 인터페이스에서 작업자를 제거했지만 실제로는 여전히 프로세스로 표시되고 대기열에서 작업을 "훔친"
txwikinger

20
실제 프로세스가 아닌 작업자 (및 처리 작업) 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의 일부가 아닌 작업자 만 등록 취소 하려고 할 수 있습니다 . 이것이 모든 환경에서 작동하는지 모르겠지만 우분투에서는 잘 작동합니다. 이것은 작업자가이 코드를 실행하는 동일한 컴퓨터에있을 때만 작동 할 수 있습니다.
roychri

3
옵션으로 Resque.workers.map & : unregister_worker
AB

어떻게 이런 작업자가 있는지 여부에 대한 검사에 포함되지 않습니다 제공 한다 호출하기 전에 등록 해제를 unregister_worker? 이것을 결정할 방법이 있습니까?
user5243421

53

콘솔에서 :

queue_name = "process_numbers"
Resque.redis.del "queue:#{queue_name}"

그렇지 않으면 다음과 같이 제거하기 위해 가짜로 시도 할 수 있습니다.

Resque::Worker.working.each {|w| w.done_working}

편집하다

많은 사람들 이이 답변을 찬성했으며 사람들이 대기열에서 작업자를 등록 취소하는 hagope의 솔루션을 시도하는 것이 중요하다고 생각하지만 위의 코드는 대기열을 삭제합니다. 당신이 그들을 가짜로 기뻐한다면, 시원하십시오.


3
이렇게하면 전체 대기열이 삭제되고 붙어있는 대기열 만 제거하려고합니다.
jBeas

1
작은 업데이트 : 이제 대신 Resque.redis.delete의 Resque.redis.del 사용해야합니다
제임스 P 맥그래스

1
Resque.remove_queue () 메소드는 지금 실제로있다
iainbeeston

28

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

1
실제로 두 번째 시도에서 이것은 아무것도하지 않았습니다.
Shpigford

2
이것은 등록을 해제하지 않고 사망 한 유능한 직원을 정리하는 데 효과적입니다.
루카스 에클 룬드

3
이것은 모든 답변을 등록 취소하지 않기 때문에 새로운 최상의 답변처럼 보입니다. prune_dead_workers가 클래스 메소드가 아니어야합니까? 그러나 어떤 경우에도 훌륭한 솔루션입니다! 감사.
Brian Armstrong

9 명 사망 한 사람을위한 솔루션입니다. 내가 추가 할 유일한 것은 -9로 죽인 동일한 서버에서 수행해야한다는 것입니다.
Stanislav O. Pogrebnyak

Resque.workers.each (& : prune_dead_workers)
Leo

25

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 작업 컬렉션이 진행 중입니다.


3
처리 [ 'run_at']를 통해 작업 시작 시간에 액세스하는 방법을 보여주는 포인트. .started 메서드를 사용하는 다른 솔루션을 보았지만 실제로는 작업이 아닌 작업자 가 시작된 시간을 반환합니다 . 이는 붙어있는 작업자를 지우는 잘못된 방법입니다. 감사!
Lachlan Cotter

10

서버를 시작하기 위해 명령을 실행할 때마다이 명령을 실행하십시오.

$ ps -e -o pid,command | grep [r]esque

다음과 같이 보일 것입니다 :

92102 resque: Processing ProcessNumbers since 1253142769

내 예제에서 PID (프로세스 ID)를 기록하십시오.

그런 다음 두 가지 방법 중 하나의 프로세스를 종료 할 수 있습니다.

  • 정상적으로 사용 QUIT 92102

  • 강제 사용 TERM 92102

* 구문이 확실하지 QUIT 92102않거나QUIT -92102

문제가 있으면 알려주세요.


3
리눅스 콘솔에서 : kill -SIGQUIT 92102
Alexey

6

난 그냥했다:

% rails c production
irb(main):001:0>Resque.workers

근로자 명단을 찾았습니다.

irb(main):002:0>Resque.remove_worker(Resque.workers[n].id)

... 여기서 n은 원치 않는 작업자의 인덱스 (0부터 시작)입니다.


2

Redis가 유효하지 않은 (비 실행중인) 작업자가 포함 된 디스크에 DB를 저장하는 것과 비슷한 문제가있었습니다. Redis / resque가 시작될 때마다 나타납니다.

다음을 사용하여이를 수정하십시오.

Resque::Worker.working.each {|w| w.done_working}
Resque.redis.save # Save the DB to disk without ANY workers

Redis 및 Resque 작업자를 다시 시작하십시오.


2

호스트 이름으로 Redis에서이를 제거하는 방법은 다음과 같습니다. 이것은 서버를 해제하고 작업자가 정상적으로 종료되지 않을 때 발생합니다.

Resque.workers.each { |w| w.unregister_worker if w.id.start_with?(hostname) }

2

나는이 문제에 부딪 치고 여기에서 많은 제안을 이행하는 길을 시작했다. 그러나이 문제를 일으키는 근본 원인 은 gem redis-rb 3.3.0을 사용하고 있다는 것 입니다. redis-rb 3.2.2로 다운 그레이드하면 이러한 작업자가 처음부터 고착되는 것을 방지 할 수있었습니다.


1

최근 https://github.com/shaiguitar/resque_stuck_queue/에서 작업을 시작했습니다 . 갇힌 작업자를 수정하는 방법에 대한 솔루션은 아니지만 resque hang / 걸린 문제를 해결 하므로이 스레드의 사람들에게 도움이 될 수 있다고 생각했습니다. README에서 :

"resque가 특정 기간 내에 작업을 실행하지 않으면 미리 정의 된 처리기가 트리거됩니다.이를 사용하여 이메일, 호출기 의무, 추가 resque 작업자 추가, resque 다시 시작, txt 전송에 사용할 수 있습니다. .. 무엇이든 당신에게 어울립니다. "

생산에 사용되어 왔으며 지금까지 꽤 잘 작동합니다.


0

나는 노동자가 실제로 거기에 있고 잘 달리고 있기 때문에 여기에 갇힌 / 이야기를 잘 짜는 노동자 들이나 '잡스'라고 말해야하는 것은 붙어있는 갈래 과정입니다.

나는 bash 스크립트를 통해 5 분 이상 동안 포크 프로세스 "Processing"을 죽이는 잔인한 해결책을 선택했다. 그러면 작업자는 다음 줄을 큐에 스폰하고 모든 것이 계속 진행된다.

내 스크립트를 살펴보십시오 : https://gist.github.com/jobwat/5712437


0

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"

두 번째 마지막 줄은 작업자를 삭제합니다.


좋은 생각이 아닙니다. 이것은 Resque에서 unregister 훅을 호출하지 않으며, 호출 실패 및 사람들이 가질 수있는 정리 코드를 호출하지 않습니다.
Jeremy

이 기능은 2 년 전 인터페이스를 사용하여 삭제할 수 없었던 작업이 중단되어 레일에서 작업을 수행 할 수있는 깔끔한 방법이 없었던 resque에서 유용했습니다.
Andrei R

0

최신 버전의 Resque를 사용하는 경우 내부 API가 변경되면 다음 명령을 사용해야합니다.

Resque::WorkerRegistry.working.each {|work| Resque::WorkerRegistry.remove(work.id)}

0

1.26.0보다 최신 버전을 사용하는 한 문제를 피할 수 있습니다.

resque: env QUEUE=foo TERM_CHILD=1 bundle exec rake resque:work

현재 실행중인 작업을 완료 할 수 없습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.