2012-02-01 39 views
45

Một trong những vấn đề, tôi phải đối mặt với giám sát là khi tôi có một lệnh mà lần lượt sinh ra một quá trình khác, giám sát là không thể giết nó.giám sát dừng quy trình con

Ví dụ tôi có một quá trình java mà khi chạy bình thường giống như

$ zkServer.sh start-foreground 
$ ps -eaf | grep zk 
user 30404 28280 0 09:21 pts/2 00:00:00 bash zkServer.sh start-foreground 
user 30413 30404 76 09:21 pts/2 00:00:10 java -Dzookeeper.something..something 

Các tập tin cấu hình supervisord trông giống như:

[program:zookeeper] 
command=zkServer.sh start-foreground 
autorestart=true 
stopsignal=KILL 

Những loại của các quá trình trong đó có nhiều Childs không tốt xử lý bởi người giám sát khi nói đến việc ngăn chặn họ từ supervisorctl. Vì vậy, khi tôi chạy điều này từ người giám sát và cố gắng để ngăn chặn nó từ supervisorctl, chỉ có quá trình cấp cao nhất bị giết nhưng không phải là quá trình java thực tế.

+2

Đó là sự hiểu biết của tôi rằng việc sử dụng ['systemd'] (http://en.wikipedia.org/wiki/Systemd)' init'-replacement của ['cgroups'] (http: //en.wikipedia. org/wiki/Cgroups) cho phép theo dõi các quy trình con một cách đáng tin cậy. Nó có thể phù hợp với nhu cầu của bạn. – sarnold

+0

eh stackoverflow đang thay đổi 'supervisord' thành 'supervised' một lần nữa! – FUD

Trả lời

6

Tính năng gần đây đã được thêm vào người giám sát để gửi SIGKILL cho toàn bộ nhóm xử lý. It's in github nhưng chưa chính thức phát hành.

Nếu quá trình id có sẵn trong một tập tin, bạn có thể sử dụng pid-proxy program

65

Vấn đề tương tự đã gặp phải bởi Rick Hanlon II ở đây: https://coderwall.com/p/4tcw7w

Lựa chọn stopasgroup = true nên được đặt trong phần chương trình để người giám sát dừng không chỉ quá trình cha mẹ mà còn là quá trình con.

Ví dụ được đưa ra như:

[program:some_django] 
command=python manage.py runserver 
directory=/dir/to/app 
stopasgroup=true 

Ngoài ra, có nhớ rằng bạn có thể có một gói phần mềm cũ của supervisord mà không có "stopasgroup" chức năng. Tôi đã thử các gói Debian này trên Raspberry Pi:

  • supervisor_3.0a8 không hoạt động.
  • supervisor_3.0b2-1 hoạt động như mong đợi.
+4

Cũng lưu ý rằng giám sát viên không tự động thay đổi cấu hình. Bạn sẽ cần chạy 'supervisorctl update' để áp dụng các thay đổi cho cấu hình của bạn, hoặc khởi động lại quá trình giám sát. – jjmontes

+2

Điều này thực sự nên là tùy chọn mặc định. –

+0

Điều này làm việc hoàn hảo cho tôi với người giám sát 3.2. Cảm ơn. – Cerin

11

Làm sau đầu trong kịch bản bash chính gọi bằng supervisord cố định các vấn đề đối với tôi:

trap "kill -- -$$" EXIT 

này giết chết toàn bộ nhóm quá trình khi kịch bản chính lối thoát hiểm, chẳng hạn như khi nó bị giết bởi người giám sát.

3

Bài viết sau đây có một cuộc thảo luận chuyên sâu của vấn đề:

http://veithen.github.io/2014/11/16/sigterm-propagation.html

+0

exec ... giải quyết nó cho tôi. Tùy chọn đầu tiên trong bài viết. Cảm ơn –

+0

Cảm ơn bạn đã dạy cách bắt cá thay vì cung cấp cá;) –

0

Bạn cũng có thể sử dụng ưu tiên trong /conf.d/your-configuration.conf tập tin. Ví dụ, nếu bạn muốn chạy zookeeper đầu tiên và sau đó kafka bạn có thể chỉ định hai chương trình.

Mức độ ưu tiên thấp hơn có nghĩa là chương trình bắt đầu trước và dừng lại sau cùng.

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