Làm cách nào tôi có thể định cấu hình chương trình được quản lý giám sát để đợi X giây trước khi bắt đầu khởi động lại?


9

Tôi đã có một quy trình công nhân xử lý 1 tin nhắn RabbitMq tại một thời điểm. Ngay bây giờ, ngay khi nhân viên thoát ra, giám sát viên sẽ khởi động lại nó (sẽ xử lý tin nhắn tiếp theo).

Tôi muốn đặt khoảng thời gian X giây, để giám sát viên không khởi động lại một cách bất đắc dĩ, nhưng nó sẽ đợi một khoảng thời gian nhất định trước khi bắt đầu một nhân viên khác.

Điều này có thể không? Làm sao?

Câu trả lời:


11

Không có cách nào để chỉ định khoảng thời gian trong phần chương trình giám sát, nhưng điều bạn có thể làm là đưa "ngủ ()" vào mã của mình để sau khi chương trình đợi trong khoảng thời gian xác định sau khi kết thúc xử lý tin nhắn.

Nếu bạn không muốn / không thể thay đổi mã chương trình, bạn có thể thử gói nó thành tập lệnh bash, ví dụ:

#!/bin/bash
/usr/local/bin/myprogram
sleep 30

Và thay đổi phần chương trình giám sát của bạn để chạy tập lệnh đó, thay vì chương trình của bạn:

command=/usr/local/bin/myprogram.sh

Giấc ngủ sẽ không được thực hiện cho đến khi / usr / local / bin / myprogram trở lại?
loostro

Chính xác, chỉ sau khi chương trình của tôi thoát ra, giấc ngủ sẽ bắt đầu đếm.
Jakov Sosic

Một vấn đề là tập lệnh này không xử lý tín hiệu, đặc biệt là HẠN.
Torsten Bronger

9

Tôi cần một cách đơn giản để chạy một lệnh từ bên trong một container docker, nơi không có cron. Đây là những gì tôi đang sử dụng:

[program:runevery]
directory = /my/workdir
command = sh -c "sleep 5;date >>/root/test.ts"
stdout_logfile = /var/log/supervisor/%(program_name)s.log
stderr_logfile = /var/log/supervisor/%(program_name)s.log
autorestart = true
startsecs = 0
exitcodes = 0,1,2

startedecs = 0 đảm bảo rằng người giám sát nghĩ rằng lệnh đã được khởi động thành công ngay cả khi nó thoát sau vài giây. Nếu không, người giám sát sẽ ngừng khởi động lại nó, nghĩ rằng đó là một vòng lặp.

Đây là những gì bạn sẽ thấy trong /root/date.ts với ví dụ trên:

# tail -f /root/test.ts 
Tue Nov 17 20:42:58 UTC 2015
Tue Nov 17 20:43:04 UTC 2015
Tue Nov 17 20:43:10 UTC 2015
[...]

Điều chỉnh giấc ngủ theo ý thích của bạn và thay thế 'ngày >> / root / test.ts' bằng bất cứ điều gì bạn cần.

Giải pháp này cũng có ích nếu bạn cần chạy cronjob thường xuyên hơn mỗi phút.


+1 cho giải pháp thông minh. Tôi muốn làm một cái gì đó tương tự. Thật không may, điều này không phù hợp với tôi vì tôi cần lấy mã thoát trong trình nghe bằng cách sử dụng lệnh gọi RPC. Thật không may, người giám sát khởi động lại chương trình ngay sau khi thoát, tạo mã 0, thở dài ... Còn ý tưởng nào khác không?
Onema

0
[program:yourapp]
command = bash -c "sleep 60 && exec urcmd'
startsecs = 65 ; 

và sau đó

supervisorctl -c your_config_file reload

1. bạn cần sử dụng execlệnh, nếu không nó sẽ rẽ nhánh từ sleep 60 && exec your commandvà tiến trình của bạn sẽ như sau

$ ps -ef|grep urcmd
work      1818  1698  0 17:35 ?        00:00:00 bash -c sleep 60 && urcmd
work      3872  1818  0 17:36 ?        00:00:00 urcmd

và sau đó khi bạn sử dụng supervisorctlđể dừng urApp, bạn sẽ dừng tiến trình 1818 và để lại 3872 tiến trình mồ côi

2. khuyến nghị thay đổi startecs thành 5 nhiều hơn số giây ngủ, sau đó khi bạn khởi động ứng dụng này và kiểm tra trạng thái, nó sẽ cho bạn thấy nó đang bắt đầu

$supervisorctl -c your_config_file status;echo;ps -ef|grep urcmd
urapp                          STARTING  
otherapp                       RUNNING   pid 13502, uptime 0:00:55

$supervisorctl -c your_config_file status;echo;ps -ef|grep urcmd
urapp                          RUNNING   pid 13503, uptime 0:00:05
otherapp                       RUNNING   pid 13502, uptime 0:00:65

khác nếu bạn đặt giá trị nhỏ hơn giây ngủ, khi bạn khởi động ứng dụng và kiểm tra trạng thái, bạn sẽ nhận được trạng thái đang chạy, nhưng nó vẫn ngủ cmd trước khi thực thi

3. khi bạn thay đổi tệp cấu hình của mình, bạn cần sử dụng tải lại cmd hoặc chỉ cần khởi động lại trình giám sát của mình để làm cho nó hoạt động

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.