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