Подтвердить что ты не робот

Использование супервизора в качестве CRON

Есть ли способ настроить supervisor для запуска некоторой команды каждые X секунд (например, CRON)?

Я вижу пример с eventlistener и событием TICK_

[eventlistener:memmon]
command=memmon -a 200MB -m [email protected]
events=TICK_60

Но он запускает команду только один раз.

4b9b3361

Ответ 1

Проблема

Как вы видите в примере с memmon, supervisord не выполняет memmon -a 200MB -m [email protected] при каждом событии. Скорее, он запускает этот прослушиватель событий один раз (или, возможно, несколько раз, если вы настраиваете пул), а затем отправляет каждое новое событие через стандартный ввод существующего процесса.

Решение

Следовательно, вам действительно нужно найти или написать совместимый с супервизором приемник событий для каждого дополнительного типа возможностей, которые вы хотите задействовать в событиях.

Пример способа реализации

Настройте конфигурацию и напишите слушателю

написать раздел о событиях supervisord.cfg

[eventlistener:passthru]
command=/tmp/simple.py /bin/date -u +"%%s %%S:%%H:%%d:%%m"
events=TICK_60

(note- экранирование % для configParser)

написать обработчик событий simple.py

Создайте этот обработчик simple.py, внеся изменения в примерный прослушиватель из документов, чтобы он выполнял свой первый аргумент со всеми оставшимися аргументами:

#! /usr/bin/python
import sys
import subprocess

def write_stdout(s):
    sys.stdout.write(s)
    sys.stdout.flush()

def write_stderr(s):
    sys.stderr.write(s)
    sys.stderr.flush()

def main(args):
    while 1:
        write_stdout('READY\n') # transition from ACKNOWLEDGED to READY
        line = sys.stdin.readline()  # read header line from stdin
        write_stderr(line) # print it out to stderr
        headers = dict([ x.split(':') for x in line.split() ])
        data = sys.stdin.read(int(headers['len'])) # read the event payload
        res = subprocess.call(args, stdout=sys.stderr); # don't mess with real stdout
        write_stderr(data)
        write_stdout('RESULT 2\nOK') # transition from READY to ACKNOWLEDGED

if __name__ == '__main__':
    main(sys.argv[1:])
    import sys

Убедитесь, что конфигурация супервизора работает

$ supervisorctl [-c cfg]
supervisor> status
passthru                         RUNNING   pid 4471, uptime 0:00:32
supervisor> tail passthru
  OKREADY
  RESULT 2
  OKREADY
  ...
supervisor> tail passthru stderr
supervisor> tail passthru stderr
  ver:3.0 server:supervisor serial:0 pool:passthru poolserial:0 eventname:TICK_60 len:15
  1451411161 01:17:29:12 <--- output
  when:1451411160ver:3.0 server:supervisor serial:1 pool:passthru poolserial:1 eventname:TICK_60 len:15
  1451411220 00:17:29:12 <--- output
  when:1451411220

Теперь date -u +"%s %S:%H:%d:%m" работает каждые 60 секунд.

Обмен в нужной команде

создать исполняемый скрипт

/tmp/hiworld.php:

#! /usr/bin/php
<?= "hiya\n"; 

(chmod +x...)

изменить аргументы слушателя в supervisord.cfg

[eventlistener:passthru]
command=/tmp/simple.py /tmp/hiworld.php
;stdout_logfile=/tmp/passthru 
events=TICK_60
;autorestart=true
;startsecs=0

перезагрузите диспетчер и проверьте (кажется, перечитать не обнаружит это изменение)

supervisor> reload
   Really restart the remote supervisord process y/N? y
   Restarted supervisord
supervisor> status
   passthru                         RUNNING   pid 6017, uptime 0:00:10
supervisor> tail passthru stderr
supervisor> status
   passthru                         RUNNING   pid 6017, uptime 0:00:21
supervisor> status
   passthru                         RUNNING   pid 6017, uptime 0:01:01
supervisor> tail passthru stderr
   ver:3.0 server:supervisor serial:316 pool:passthru poolserial:0 eventname:TICK_60 len:15
    hiya
   when:1418926740
supervisor> 

End

Теперь нужная команда выполняется каждые 60 секунд. Теперь вы читаете, чтобы настроить детали разрешений, местоположений, журналов и т.д.

Ответ 2

Зачем изобретать колесо? Вы можете использовать cron и supervisord вместе.

В supervisord создайте задачу с autostart=false

В cron используйте * * * * * supervisorctl start <taskname> для запуска задачи каждую минуту

Ответ 3

Supervisor не поддерживает это легко.

Но для достижения своей цели вы можете просто использовать supervisor для запуска cron (например, для контейнера Docker):

https://gist.github.com/martinrusev/7015e393d46647dbad15

Установите cron в докер (apt-get install cron с докероподобным докером)

В конфигурации супервизора:

[program:cron]
command=cron -f -L 15
autostart=true
autorestart=true

-f для переднего плана, -L 15 должен выводить все журналы cron.

Затем используйте пользовательский crontab, глобальный /etc/crontab или любой специальный каталог crontab (/etc/cron.hourly, /etc/cron.daily,…)

Ответ 4

Вы можете использовать crobtab для управления и планирования ваших программ супервизора.

Используйте команду supervisorctl start <program_name>

Примечание: это запустит только один экземпляр программы супервизора. Если он уже запущен и crontab пытается запустить его снова, команда supervisorctl start не запустит новый экземпляр.

Ответ 5

Вы можете вызвать команду bash sleep:

[program:mycmd]
command=bash -c 'sleep 300 && exec <your command here>'

Это будет запускать вашу команду каждые 5 минут. Не забудьте часть exec, чтобы заменить процесс bash вашей командой, чтобы супервизор получил правильный код выхода.