Utiliser le superviseur comme CRON

Est-il possible de configurer superviseur lancer une commande toutes les X secondes (comme CRON)?

je vois exemple avec eventlistener et TICK_ événement

[eventlistener:memmon]
command=memmon -a 200MB -m bob@example.com
events=TICK_60

Mais il exécute la commande qu'une seule fois.

25
demandé sur barbushin 2014-12-07 13:48:23

4 réponses

Problème

comme vous le voyez dans l'exemple memmon, supervisord n'exécute pas memmon -a 200MB -m bob@example.com à chaque événement. Il commence plutôt à écouter cet événement une fois (ou peut-être quelques fois si vous configurez un pool) et envoie ensuite chaque nouvel événement par l'entrée standard d'un processus existant.

Solution

par conséquent, vous avez vraiment besoin de trouver ou d'écrire un écouteur d'événements compatible superviseur pour chaque type supplémentaire de capacité que vous voulez déclencher sur événement.

exemple de méthode de mise en oeuvre

configurer la configuration et écrire un écouteur

rédiger un superviseur.section des événements du GFC

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

(note - le s'échapper de % pour configParser)

écrire un simple.py Event Listener

Créer cette simple.py auditeur en apportant des changements à l'exemple écouteur de l'docs donc il exécute son premier argument avec les arguments restants:

#! /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

assurez - vous que la configuration du superviseur fonctionne

$ 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" fonctionne toutes les 60 secondes.

Swapping dans la commande désirée

créer un script exécutable

/ tmp / hiworld.php:

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

(chmod +X...)

modifier les arguments de l'auditeur dans supervisord.cfg

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

recharger supervisord et test (relire ne semble pas détecter ce changement)

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> 

maintenant la commande désirée tourne toutes les 60 secondes. vous êtes maintenant lu pour ajuster les détails des permissions, emplacements, journaux, etc.

16
répondu lossleader 2017-06-29 13:28:14

le superviseur n'appuie pas aussi facilement.

Mais pour atteindre votre objectif, vous pouvez simplement utiliser superviseur pour commencer cron (pour un panneau contenant par exemple):

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

6
répondu wid 2015-04-10 16:02:54

Pourquoi inventer la roue? Vous pouvez utiliser cron et supervisord ensemble.

dans supervisord, créez une tâche avec autostart=false

dans cron, utilisez * * * * * supervisorctl start <taskname> pour démarrer la tâche de chaque minute

3
répondu AlexM 2017-08-23 05:01:43

vous pouvez utiliser crobtab pour gérer et programmer vos programmes de superviseur.

utiliser la commande supervisorctl start <program_name>

Remarque:: cela ne commencera qu'une seule instance du programme de superviseur. Si elle est déjà en cours d'exécution et que crontab essaie de la déclencher à nouveau,supervisorctl start la commande ne démarre pas une nouvelle instance.

1
répondu Raman 2018-06-21 08:29:28