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.
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.
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):
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
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.