2012-04-02 25 views
11

Sau khi cấp tín hiệu TERM cho nhân viên Celery hai lần (tắt máy tắt máy và tắt máy lạnh) bằng cách sử dụng phím tắt CTlr-C, nhân viên Celery bị treo lên. Nó không tiêu tốn tin nhắn hoặc thực hiện nhiệm vụ (như mong đợi) nhưng nó cũng không tắt.Tại sao Celery không tắt sạch?

Tôi chạy strace về quy trình Celery để xem điều gì đang xảy ra phía sau hiện trường. Đây là strace sản lượng trên PID của tiến trình chính cần tây

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

Và đây là những gì tôi tìm thấy làm strace trên tiến trình con:

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 
...................................................... 

Tôi biết tôi có thể đưa ra một tín hiệu KILL các quy trình để loại bỏ chúng. Nhưng tôi tò mò muốn tìm hiểu những gì đang thực sự ngăn chặn các quá trình này để được tắt máy, và nếu nó có thể làm điều gì đó về nó.

phần mềm stack: Python 2.6.2, 2.4.6 Cần tây, CentOS 5.0

UPDATE: Việc sử dụng CPU là xuống gần 0%. Những nhiệm vụ này khá nhiều CPU, do đó, điều này xác nhận rằng không có tác vụ nào hiện đang hoạt động.

Trả lời

3

Từ docs:

Nếu người lao động sẽ không tắt máy sau một thời gian ân cần, ví dụ vì nhiệm vụ mắc kẹt trong một vòng lặp vô hạn, bạn có thể sử dụng các tín hiệu KILL để buộc chấm dứt lao động , nhưng lưu ý rằng hiện tại nhiệm vụ thực hiện sẽ bị mất (trừ khi các tác vụ có bộ tùy chọn acks_late ).

Cũng từ google groups:

celeryd sẽ không đóng cửa cho đến khi tất cả các nhiệm vụ hoạt động đã được xử lý, nơi hoạt động có nghĩa các nhiệm vụ đã được bắt đầu vào (không phải tất cả nhiệm vụ dự trữ). Các tin nhắn được bảo lưu sẽ được phát hành và được gửi lại khi kênh kết nối bị đóng. Điều này xảy ra sau khi các tác vụ hoạt động đã trở lại. nếu bạn không có - celeryd được kích hoạt giới hạn thời gian sẽ không bao giờ giết nhiệm vụ của bạn khi tắt máy, ngay cả khi họ mất DAYS để hoàn tất.

+2

không có tác vụ đang hoạt động nào. Các nhiệm vụ đã chạy vào thời điểm phát hành tín hiệu dừng đã kết thúc. Chiều dài hàng đợi vẫn giữ nguyên. Không có gì đang được xuất ra các bản ghi. Nhưng các quy trình vẫn chưa chấm dứt. Như tôi đã nói, tôi * có thể * phát hành KILL và loại bỏ chúng. Nhưng đây sẽ không phải là một giải pháp hiệu quả. Để sử dụng phần mềm này một cách đáng tin cậy, tôi cần phải có khả năng dừng (và bắt đầu) nó tự động w/ít hoặc không có sự can thiệp thủ công. – rubayeet

+1

Một giải pháp tốt cho việc này là để daemonize cần tây. Giám sát là một ứng cử viên xuất sắc. – hymloth

+1

Tôi đang sử dụng tập lệnh init chung để làm daemon công nhân: https://github.com/ask/celery/blob/master/contrib/generic-init.d/celeryd – rubayeet

Các vấn đề liên quan