2012-04-02 2 views
11

Ctlr-C 키보드 인터럽트를 사용하여 셀 램프 작업자에게 TERM 신호를 두 번 (Warm shutdown 및 콜드 셧다운) 실행 한 후 셀러리 작업자가 막 중단되었습니다. 그것은 (예상대로) 메시지 나 실행 태스크를 소비하지 않지만 종료하지는 않습니다.셀러 리가 깔끔하게 종료되지 않는 이유는 무엇입니까?

셀러리 프로세스에서 strace을 실행하여 장면 뒤에서 진행되는 것을 확인했습니다.

strace -p 27874 
Process 27874 attached - interrupt to quit 
select(4, [3], NULL, NULL, {0, 562000}) = 0 (Timeout) 
futex(0x871a808, FUTEX_WAKE, 1)   = 0 
select(4, [3], NULL, NULL, {1, 0})  = 0 (Timeout) 
futex(0x871a808, FUTEX_WAKE, 1)   = 0 
...................................................... 

내가하는 과정에 KILL 신호를 발행 할 수 있습니다 알고 다음은 셀러리 주 과정 여기

strace -p 27867 
Process 27867 attached - interrupt to quit 
futex(0xb966a78, FUTEX_WAIT, 0, NULL 

와의 PID에 strace 출력은 내가 자식 프로세스에 strace하고 무엇을 발견입니다 그들을 제거. 그러나 실제로 이러한 프로세스가 종료되는 것을 막는 것이 무엇인지, 그리고 그것에 대해 무언가를 할 수 있는지 궁금합니다.

소프트웨어 스택 : 파이썬 2.6.2, 셀러리 2.4.6, CentOS는 5.0

업데이트 : CPU 사용량이 거의 0 %까지입니다. 이러한 작업은 CPU를 많이 사용하므로 현재 활성화 된 작업이 없음을 확인합니다. docs에서

답변

3

:

노동자가 종료되지 배려 시간이 지나면 때문에 무한 루프에 갇혀 작업의 예를 를 들어, 사용자가 노동자를 종료 강제로 KILL 신호를 사용할 수있는 경우 작업이 acks_late 옵션이 설정되어 있지 않으면 현재 실행중인 작업이 손실됩니다. google groups에서도

모든 활성 태스크가 처리 될 때까지 활성이 (모든 예약 작업)에서 시작된 작업을 의미 여기서

celeryd는 종료하지 않을 것이다. 연결 채널을 닫으면 예약 된 메시지가 해제되고 이 다시 전달됩니다. 활성 작업이 반환 된 후 발생합니다. - 시간 제한을 사용하지 않으면 celeryd가 작업을 종료 할 때까지 일을 죽이지 않습니다. 하루가 끝나도 완료됩니다.

+2

활성 작업이 없습니다. 정지 신호를 발행 할 때 실행 중이던 작업이 완료되었습니다. 대기열 길이는 동일하게 유지됩니다. 로그에 아무 것도 출력되지 않습니다. 그러나 프로세스는 여전히 종료되지 않습니다. 내가 말했듯이, 나는 * 킬 *을해서 그들을 없앨 수 있습니다. 그러나 이것은 효과적인 해결책이 아닙니다. 이 소프트웨어를 안정적으로 사용하려면 수동 개입없이 자동으로 중지 (시작) 할 수 있어야합니다. – rubayeet

+1

좋은 해결책은 샐러리를 데몬 화하는 것입니다. Supervisord는 훌륭한 후보자입니다. – hymloth

+1

저는 노동자들을 대몬 화하기 위해 일반 init 스크립트를 사용하고 있습니다 : https://github.com/ask/celery/blob/master/contrib/generic-init.d/celeryd – rubayeet

관련 문제