Est-il possible de configurer supervisor pour exécuter des commandes toutes les X secondes (comme CRON)?
Je vois des exemples avec eventlistener et TICK_ event
[eventlistener:memmon]
command=memmon -a 200MB -m [email protected]
events=TICK_60
Mais il exécute la commande une seule fois.
Comme vous le voyez dans l'exemple memmon, supervisord n'exécute pas memmon -a 200MB -m [email protected]
à chaque événement. Au lieu de cela, il lance cet écouteur d'événement une fois (ou éventuellement plusieurs fois si vous configurez un pool), puis envoie chaque nouvel événement via l'entrée standard d'un processus existant.
Par conséquent, vous avez réellement besoin de rechercher ou d'écrire un écouteur d'événement compatible avec le superviseur pour chaque type de fonctionnalité supplémentaire que vous souhaitez déclencher pour les événements.
écrire une section d'événement supervisord.cfg
[eventlistener:passthru]
command=/tmp/simple.py /bin/date -u +"%%s %%S:%%H:%%d:%%m"
events=TICK_60
(note- l'échappement de % pour configParser )
écrire un écouteur d'événement simple.py
Créez ce programme d'écoute simple.py en apportant des modifications à l'exemple de programme d'écoute à partir de la documentation afin d'exécuter son premier argument avec tous 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 __== '__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
Maintenant, date -u +"%s %S:%H:%d:%m"
est exécuté toutes les 60 secondes.
créer un script exécutable
/tmp/hiworld.php:
#! /usr/bin/php
<?= "hiya\n";
(chmod + x ...)
change 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
reload supervisord and test (la relecture semble ne 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 souhaitée est exécutée toutes les 60 secondes. Vous êtes maintenant prêt à ajuster les détails des autorisations, des emplacements, des journaux, etc.
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 toutes les minutes.
Le superviseur ne supporte pas cela facilement.
Mais pour atteindre votre objectif, vous pouvez simplement utiliser supervisor pour démarrer cron (pour un conteneur docker par exemple):
Vous pouvez utiliser crobtab pour gérer et planifier vos programmes de superviseur.
Utilisez la commande supervisorctl start <program_name>
Remarque : Ceci ne démarrera qu'une seule instance du programme superviseur. S'il est déjà en cours d'exécution et que crontab tente de le déclencher à nouveau, la commande supervisorctl start
ne démarrera pas une nouvelle instance.
Vous pouvez appeler la commande bash sleep
:
[program:mycmd]
command=bash -c 'sleep 300 && exec <your command here>'
Cela lancera votre commande toutes les 5 minutes. N'oubliez pas la partie exec
pour remplacer le processus bash par votre commande afin que le superviseur obtienne le code de sortie correct.