Giám sát viên không tải tập tin cấu hình mới


68

Tôi gặp sự cố khi triển khai ứng dụng Django bằng Gunicorn và Người giám sát. Mặc dù tôi có thể khiến Gunicorn phục vụ ứng dụng của mình (bằng cách đặt PYTHONPATH thích hợp và chạy lệnh apropitable, lệnh từ cấu hình giám sát) Tôi không thể tạo giám sát viên để chạy nó. Nó sẽ không nhìn thấy ứng dụng của tôi. Tôi không biết làm thế nào để đảm bảo nếu tập tin cấu hình ổn.

Đây là những gì giám sát viên nói:

# supervisorctl start myapp_live
myapp_live: ERROR (no such process)

Tôi đang chạy nó trên Ubuntu 10.04 với cấu hình sau:

Tệp /home/myapp/live/deploy/supervisord_live.ini:

[program:myapp_live]
command=/usr/local/bin/gunicorn_django --log-file /home/myapp/logs/gunicorn_live.log --log-level info --workers 2 -t 120 -b 127.0.0.1:10000 -p deploy/gunicorn_live.pid webapp/settings_live.py
directory=/home/myapp/live
environment=PYTHONPATH='/home/myapp/live/eco/lib'
user=myapp
autostart=true
autorestart=true

Trong /etc/supervisor/supervisord.conf, ở cuối tệp, có:

[include]
files = /etc/supervisor/conf.d/*.conf

và đây là một liên kết tượng trưng đến tập tin cấu hình của tôi:

# ls -la /etc/supervisor/conf.d
lrwxrwxrwx 1 root root   48 Dec  4 18:02 myapp-live.conf -> /home/myapp/live/deploy/supervisord_live.ini

tất cả mọi thứ có vẻ tốt cho tôi nhưng giám sát chỉ tiếp tục nói myapp_live: ERROR (no such process). Bất kỳ giải pháp cho điều này?


Tôi đã gãi đầu với cùng một vấn đề; tập tin cấu hình của tôi không được tải khi tôi chạy rereadhoặc update. Hóa ra tôi đã lưu các tập tin cấu hình của mình foo.conf.pythay vì foo.confđể chúng không được xác định.
Timmy O'Mahony

Câu trả lời:


31

Tôi đã có cùng một vấn đề, một

sudo service supervisord reload

đã lừa, mặc dù tôi không biết đó có phải là câu trả lời cho câu hỏi của bạn không.


2
Tôi dừng lại và sau đó bắt đầu giám sát một thời gian trước và nó đã làm việc. Không biết liệu tải lại có hoạt động không (vì tôi không khởi động lại) nhưng tôi đoán nó có thể
grucha

Tôi cũng đã làm nó và nó đã làm việc. Tôi tự hỏi tại sao /etc/init.d/supervisor restartkhông hoạt động khi dừng thủ công và bắt đầu làm.
Kirill

1
Làm việc cho tôi, mặc dù dịch vụ không hoạt động nên tôi mới chạy ps aux | grep supervisorvà sau đósudo kill -HUP pid
Wayne Werner

2
Điều này rất nguy hiểm vì nó sẽ khởi động lại toàn bộ daemon của người giám sát.
Mark Theunissen

7
đọc lại giám sát có thể sửa lỗi này mà không cần khởi động lại dịch vụ.
Jonathan Liuti

199

Câu trả lời đúng là người giám sát yêu cầu bạn đọc lại cập nhật khi bạn đặt một tệp cấu hình mới. Khởi động lại không phải là câu trả lời, vì điều đó sẽ ảnh hưởng đến các dịch vụ khác. Thử:

supervisorctl reread
supervisorctl update

13
Đây phải là câu trả lời chính xác. "Giám sát đọc lại" một mình là không đủ.
Miebster

3
+1 Đây là một câu trả lời tốt hơn vì nó không phụ thuộc vào Trình quản lý quy trình.
tidwall

8
"Đọc lại giám sát" một mình là không đủ, nhưng liệu "cập nhật giám sát" có đủ không? Theo tài liệu "cập nhật" thực hiện đọc lại sau đó là khởi động lại bất kỳ chương trình nào có cấu hình đã được sửa đổi bởi đọc lại.
BlueBomber

Nó làm việc cho tôi. Tôi đã thực hiện khởi động lại sau đó.
1012513

15

Hãy chắc chắn rằng các tệp conf của người giám sát của bạn kết thúc bằng .conf

Mất một lúc để tìm ra cái đó. Hy vọng nó sẽ giúp người tiếp theo.


1
Đã lãng phí một giờ cho cùng một vấn đề - không thể tin rằng nó đơn giản như vậy.
Zane Hooper

1
Cảm ơn đã liệt kê câu trả lời này. Đối với cuộc sống của tôi, tôi không thể tìm ra điều này.
Phillip Martin

14

Tải lại quy trình giám sát chính có thể hoạt động, nhưng nó sẽ có tác dụng phụ ngoài ý muốn nếu bạn có nhiều hơn một quy trình được giám sát bởi giám sát viên.

Cách chính xác để thực hiện là phát hành supervisorctl rereadkhiến nó quét các tệp cấu hình cho bất kỳ thay đổi nào:

root@debian:~# supervisorctl reread
gunicorn: changed

Sau đó, chỉ cần tải lại ứng dụng đó:

root@debian:~# supervisorctl restart gunicorn
gunicorn: stopped
gunicorn: started

Đây là giải pháp tốt nhất nếu bạn chỉ muốn đọc tệp cấu hình đã thay đổi / mới và không để các phần còn lại của quá trình đang chạy. Người giám sát sẽ hiển thị các ứng dụng mới avail. Thêm nó vào (tái) các quá trình có thể bắt đầu bằng cách phát hành supervisorctl update. Xem thêm câu trả lời của Mark serverfault.com/a/479754/125887
Sjaak Trekhaak

4
Điều này là không đủ cho tôi. supervisorctl updatelà cần thiết
Yaroslav Nikitenko

5

Tôi gặp phải sự cố này khi sử dụng gói giám sát, phiên bản 3.0a8-1.1 từ Ubuntu Server 12.10. Tôi đã kết thúc việc giải quyết vấn đề bằng cách đọc phần trợ giúp tích hợp:

$ sudo supervisorctl help restart
restart <name>          Restart a process
restart <gname>:*       Restart all processes in a group
restart <name> <name>   Restart multiple processes or groups
restart all             Restart all processes

Cụ thể bạn muốn sử dụng cú pháp:

sudo supervisorctl restart myapp_live:*

Như tài liệu nêu tại http://supervisord.org/configuration.html#programx-section - "Phần [chương trình: x] thực sự đại diện cho một nhóm quy trình đồng nhất của người Hồi giáo cho người giám sát (kể từ 3.0)." Vì vậy, có thể vấn đề đầu tiên xuất hiện trong phiên bản 3.0.

Tái bút: Tôi mới làm giám sát viên; Tôi đang sử dụng https://github.com/bdarnell/tornado-production-skeleton/blob/8ad055457646929c0e8f48aaf20d98f054b1787b/production/chat.supervisor như một ví dụ về những gì một cấu hình tối thiểu sẽ giống như thế.


4

Tôi đã có một vấn đề tương tự ( myapp_live: ERROR (no such process)) và đó là do định nghĩa quy trình của tôi là

[program: myapp_live]

khi nào nó nên

[program:myapp_live]

Mặc dù điều này không giải quyết được câu hỏi đã được hỏi, tôi đã được Tìm kiếm ở đây để tìm kiếm một giải pháp cho vấn đề của tôi, vì vậy hy vọng những người khác cũng tìm thấy nó ở đây.


Tương tự ở đây! Tôi đã để nó như [program]chỉ, theo các tài liệu, nhưng làm cho nó [program:redis]làm cho nó hoạt động. Đôi khi mọi thứ trở nên kỳ lạ!
ankush981

2

Tôi thấy giải pháp này là thuận tiện nhất:

EDIT: trước khi thực hiện việc này, hãy kiểm tra đường dẫn giám sát của bạn bằng cách sử dụng which supervisorctlđể đảm bảo bạn đang thêm đường dẫn đúng vào sudoers.

Thêm dòng này vào tệp sudoers bằng cách sử dụng visudo(trong đó: myappuser- người dùng cần khởi động lại ứng dụng của bạn, myapp- tên ứng dụng):

myappuser  ALL=(ALL) NOPASSWD: /usr/bin/supervisorctl restart myapp

Và sau đó đơn giản là:

sudo supervisorctl restart myapp

Bạn không bị ràng buộc với các tập lệnh khởi động của phân phối và bạn cung cấp các đặc quyền khá hẹp cho người dùng khởi động lại ứng dụng gunicorn của bạn. Ngoài ra, bạn không cần quan tâm đến pid. Lệnh sẽ không yêu cầu mật khẩu để phù hợp với các tập lệnh bash / Fabric tự động triển khai. Mặt khác - bạn phải lưu ý rằng, nếu giám sát viên dễ bị một số lỗi gây ra việc thực thi mã, người dùng độc hại có thể sử dụng đặc quyền sudo này để chạy mã gốc (nhưng theo tôi biết không có lỗi nào được phát hiện cho giám sát viên và đó là một điều lớn để tìm thấy lỗ hổng như vậy).


2

Đọc mã giám sát tại đây: https://github.com/Supervisor/supervisor/blob/master/supervisor/supervisorctl.py

Bạn có thể thấy rằng bản cập nhật giám sát (hàm do_update) đang gọi reloadConfig () chính xác như đọc lại giám sát (hàm do_reread).

Vì vậy, tôi nghĩ rằng việc gọi lại đọc là không cần thiết nếu bạn gọi cập nhật sau nó.

Từ đầu ra của git đổ lỗi, nó đã như thế này kể từ ít nhất là từ tháng 7 năm 2009.


2

Dưới đây là danh sách kiểm tra:

  1. Tệp cấu hình mới phải được đặt tên theo mẫu bao gồm được định cấu hình trong /etc/supervisord.conf:

    [include]
    files=supervisord.d/*.ini
    

    Như chúng ta thấy trong trường hợp của tôi, spam.ini sẽ được bao gồm, nhưng spam.conf thì không.

  2. Nếu bạn đã tạo tệp mới bằng cách sao chép tệp cũ, hãy đảm bảo thực sự thay đổi [program:]dòng. Bởi vì nếu bạn ngu ngốc như có hai tệp cho cùng một chương trình, supervisorctl rereadsẽ để lại cho bạn thông báo lỗi vô vọng này như hình phạt:

    No config updates to processes
    
  3. Nếu tập tin của bạn được phát hiện, supervisorctl rereadnên nói một cái gì đó như:

    spam: available
    
  4. Sau đó, supervisorctl update spamcả hai nên bắt đầu nó và làm cho nó xuất hiện trong supervisorctl status.


1

Tôi đã tìm thấy các tập lệnh init.d không đáng tin cậy trên nhiều phiên bản Ubuntu / Debian khác nhau. Cách để làm điều này là:

sudo supervisorctl reload

Đây không phải là cách đúng đắn để làm điều đó mặc dù nó sẽ hoạt động trong nhiều trường hợp. @ burhan-khalid trả lời là đúng, và cung cấp một lời giải thích cho nó.
glarrain

1

Hãy cẩn thận với các liên kết tượng trưng và bao gồm các tệp trên Giám sát. Nó sẽ cho phép bất kỳ người nào có đặc quyền w trên /home/myapp/live/deploy/supervisord_live.ini để thay đổi tệp ini và bắt đầu bất kỳ mã độc hại nào. Các tập tin ini này phải nằm trong thư mục conf của người giám sát của bạn hoặc trong bất kỳ thư mục con nào bên dưới nó.


0

Tôi đã cài đặt giám sát với cài đặt yum, cài đặt giám sát của phiên bản v2. *. Trình giám sát hỗ trợ bên ngoài chỉ bao gồm từ phiên bản 3. Thay vào đó, phải sử dụng easy_install để cài đặt trình giám sát v3.


Đây cũng là vấn đề của tôi, nó có thể sẽ xảy ra trên tất cả các cài đặt Centos 6.5 trở xuống.
bearrito
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.