다시 시작하기 전에 X 초 동안 대기하도록 supervisord 관리 프로그램을 구성하려면 어떻게해야합니까?


9

한 번에 1 개의 RabbitMq 메시지를 처리하는 작업자 프로세스가 있습니다. 현재 작업자가 종료하자마자 감독자가 작업자를 다시 시작합니다 (다음 메시지 처리).

X 초 간격을 설정하여 감독자가 즉시 다시 시작하지 않지만 다른 작업자를 시작하기 전에 주어진 시간 동안 기다립니다.

이것이 가능한가? 어떻게?

답변:


11

수퍼바이저 프로그램 섹션에 간격을 지정할 수있는 방법은 없지만 코드에 "sleep ()"을 넣어서 프로그램이 메시지 처리를 마친 후 지정된 시간 동안 기다릴 수 있습니다.

프로그램 코드를 원하지 않거나 변경하지 않으려면 다음과 같이 bash 스크립트로 줄 바꿈하십시오.

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

그리고 프로그램 대신 해당 스크립트를 실행하도록 감독자 프로그램 섹션을 변경하십시오.

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

/ usr / local / bin / myprogram이 반환 될 때까지 절전 모드가 실행되지 않습니까?
loostro

정확히, 내 프로그램이 종료 된 후에 만 ​​수면이 시작됩니다.
Jakov Sosic

문제는이 스크립트가 신호, 특히 TERM을 처리하지 않는다는 것입니다.
Torsten Bronger

9

cron이없는 도커 컨테이너 내부에서 명령을 실행하는 간단한 방법이 필요했습니다. 여기 내가 사용하는 것이 있습니다 :

[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

startsecs = 0은 수 초 후에 명령이 종료 되더라도 관리자가 명령이 성공적으로 시작된 것으로 생각하도록합니다. 그렇지 않으면 수퍼바이저가 다시 시작을 멈추고 루프에 있다고 생각합니다.

위의 예와 함께 /root/date.ts에 표시되는 내용은 다음과 같습니다.

# 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
[...]

취향에 맞게 수면을 조정하고 'date >> / root / test.ts'를 원하는 것으로 바꾸십시오.

이 솔루션은 매분보다 cronjob을 더 자주 실행해야하는 경우에도 유용합니다.


영리한 솔루션의 경우 +1 나는 비슷한 것을하고 싶다. 불행히도 RPC 호출을 사용하여 리스너에서 종료 코드를 가져와야 하므로이 기능이 작동하지 않습니다. 불행히도, 수퍼바이저는 종료 직후에 프로그램을 다시 시작하여 코드를 0으로 만듭니다.
Onema

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

그리고

supervisorctl -c your_config_file reload

1. 당신은 exec명령 을 사용해야합니다 . 그렇지 않으면 하위 sleep 60 && exec your command진행을 포크하고 진행 상황은 다음과 같습니다.

$ 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

supervisorctlurApp을 중지 할 때 1818 진행을 중지하고 3872를 고아 진행 상태로 둡니다.

2. 시작 시간을 절전 시간보다 5 초 이상으로 변경 한 다음이 앱을 시작하고 상태를 확인하면 시작 중임을 표시합니다.

$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

그렇지 않으면 값을 sleep secs보다 작게 설정하면 앱을 시작하고 상태를 확인할 때 실행 상태가 표시되지만 실제 실행 전에 여전히 cmd를 대기 중입니다.

3. 구성 파일을 변경할 때 reload cmd를 사용하거나 감독자를 다시 시작하여 작동 시키십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.