2013-06-12 52 views
13

Làm thế nào để đảm bảo các quy trình phụ được dừng lại khi tôi ngừng giám sát?Ngừng giám sát không dừng nhân viên Celery

Tôi đang sử dụng Supervisor để chạy hai công nhân Celery. Lệnh cho mỗi công nhân là:

command=/usr/local/myapp/src/manage.py celery worker --concurrency=1 --loglevel=INFO 

Khi tôi bắt đầu supervisord, họ chạy một cách hoàn hảo, nhưng khi tôi chạy sudo service supervisord stop, nó báo cáo nhân của tôi dừng lại:

celery_1: stopped 
celery_2: stopped 

Tuy nhiên, khi tôi chạy ps aux | grep celery tôi thấy chúng vẫn đang chạy:

www-data 27667 0.0 1.5 318420 64360 ?  S 10:45 0:00 manage.py celery worker --concurrency=1 --loglevel=INFO 
www-data 27668 0.0 1.5 318420 318416 ?  S 10:45 0:00 manage.py celery worker --concurrency=1 --loglevel=INFO 
+0

Hey @Certin, bạn đã đến một giải pháp cho điều này chưa? – securecurve

+0

cũng sẽ quan tâm đến giải pháp .. – kev

+0

Cerin: Bạn đã tìm ra giải pháp cho điều đó chưa? – securecurve

Trả lời

6

tôi tin rằng dừng dịch vụ giám sát dừng trình quản lý giám sát, chứ không phải quá trình giám sát quản lý cele của bạn ryworkers

supervisorctl stop all nên cho phép bạn ngăn chặn những người lao động, và cũng cho phép bạn để bắt đầu/khởi động lại chúng

http://supervisord.org/running.html#running-supervisorctl

+3

Tín hiệu mà người giám sát gửi cho nhân viên cần tây sẽ không giết họ ngay lập tức, nếu họ vẫn đang xử lý nhiệm vụ tại thời điểm đó họ sẽ tiếp tục chạy cho đến khi các nhiệm vụ đó được thực hiện.Vì vậy, có thể mất một thời gian dài để nhân viên của bạn ngừng hoạt động ngay cả sau khi gọi 'supervisorctl stop all' – jeverling

0

Không chắc, nhưng nó seams như trong trường hợp này, người giám sát đang quản lý kịch bản sh. Không phải là chủ đề python. Bạn có thể hiển thị số ps auxf | grep celery trong khi người giám sát đang chạy không? Có thể chỉnh sửa lệnh, như sau: command=python /path/to/manage.py ..., sẽ hữu ích.

1

Hãy xem qua supervisord.log của bạn. Có lẽ người giám sát đang gửi SIGKILL đến cần tây? Nếu có, hãy thử tăng thời gian chờ (ví dụ: stopwaitsecs = 600).

https://github.com/celery/celery/issues/102

3

Lý do tôi đã kết thúc ở đây là khi tôi đã sử dụng giám sát để bắt đầu và ngừng quá trình cần tây của tôi, những người lao động cần tây đã không dừng lại, mà dẫn đến sự tích lũy của người lao động.

Tôi đã thử các cài đặt khác nhau trong trình giám sát, chẳng hạn như stopignal và killasgroup. Không ai trong số họ dừng công nhân.

Tại thời điểm này, có vẻ như quy trình cần tây không gửi tín hiệu cho người lao động khi nó dừng lại.

Những gì tôi đã kết thúc làm là thêm:

ps auxww | grep 'celery worker' | awk '{print $2}' | xargs kill -9 

để kịch bản của tôi. Đây là từ the celery docs

Ở cuối lệnh này, tôi đã thử giết -TERM thay vì giết -9, hy vọng rằng sẽ giết các quy trình một cách duyên dáng hơn. Nhưng điều đó luôn luôn để lại một quá trình.

+0

Bạn nên sử dụng 'pgrep'. Sử dụng 'ps | grep' có thể có một số vấn đề như quy trình grep đang nằm trong danh sách. 'pgrep -f 'công nhân cần tây' | xargs giết -9' hoặc đơn giản là 'pkill -f' celery worker''. –

0

Tôi đã gặp sự cố như vậy với các kênh django, cài đặt stopasgroup=true trong cấu hình suppervisor (as suggested here) đã khắc phục sự cố. Tôi không hiểu tại sao, tuy nhiên.