Ich habe eine Django 1.6.2-Anwendung, die Celery 3.1.7 für asynchrone Aufgaben verwendet. Ich starte meine Celery-Worker mit Supervisor. Bisher funktioniert alles gut, außer wenn ich meinen Debian 7.8-Server neu starte. Wenn das passiert, werden meine Celery-Worker nicht neu gestartet, da beim Neustart des Servers der Eigentümer der Celery-Protokolldateien von meinem „Celery“-Benutzer auf „Root“ geändert wird. Außerdem löscht das System mein Verzeichnis /run/celery, in das ich meine PID-Dateien schreibe. Wenn ich diese Änderungen manuell vornehme und Celery neu starte, starten alle meine Worker normal.
Da diese Änderungen vor dem Starten der Worker erfolgen müssen, dachte ich, die Lösung wäre, ein Shell-Skript zu schreiben, das aufgrund seiner höheren Priorität von meinem Skript supervisor.conf vor den Celery-Worker-Befehlen ausgeführt wird (siehe unten).
Dieses Setup-Skript wird jedoch nicht ausgeführt. In meinem Supervisor-Protokoll steht nur:
exited: celery-setup (exit status 0; not expected)
gave up: celery-setup entered FATAL state, too many start retries too quickly.
Außerdem werden keine Fehler in die stdout/err-Protokolldateien geschrieben.
Meine Fragen sind:
Ist dies der richtige Ansatz, um meine Worker-Protokollberechtigungen zu ändern und die PID-Verzeichnisse neu zu erstellen, bevor die Celery-Worker neu gestartet werden?
Wenn das der richtige Ansatz ist, warum funktioniert er nicht? Und wenn nicht, was ist der richtige Ansatz?
Wenn ich anstelle von Supervisor ein init.d celeryd-Daemon-Skript verwenden würde, gäbe es einCELERY_CREATE_DIRSEinstellung, die automatisch PID- und Protokollverzeichnisse erstellt, die dem Benutzer/der Gruppe gehören. Gibt es eine Möglichkeit, diese Einstellung bei Verwendung von Supervisord zu replizieren?
Einerseits weiß ich, dass Supervisor nur für Vordergrundprozesse verwendet werden sollte, was bei diesem Skript nicht der Fall ist. Andererseits habe ich hier andere Fragen gesehen, die darauf hindeuten, dass Sie ein Shell-Skript von Supervisor aus ausführen können sollten.
Vielen Dank für Ihre Hilfe.
# celery-supervisor-setup
#!/bin/bash
for i in 1 2 3
do
if [ -f "/var/log/celery/worker${i}.log" ]; then
echo "processing $i"
chown celery:celery /var/log/celery/worker${i}.log
fi
done
if [ ! -d "/run/celery" ]; then
mkdir /run/celery
chown celery:celery /run/celery
fi
# /etc/supervisor/conf.d/supervisor.conf
[program:celery-setup]
command = /www/myproj/conf/celery-supervisor-setup
; This next command didn't work
;command = bash -c " /www/myproj/conf/celery-supervisor-setup"
user = root
stdout_logfile = /var/log/celery_setup_stdout.log
stderr_logfile = /var/log/celery_setup_stderr.log
redirect_stderr = true
autostart = true
autorestart = false
priority=997
[program:celeryw1]
command=/home/myproj/venv/myproj/bin/celery worker --app=conf.celeryapp:app -n worker1 --config=celeryconfig -Q default --loglevel=info --pidfile=/var/run/celery/worker1.pid
directory=/www/myproj
user=celery
numprocs=1
stdout_logfile=/var/log/celery/worker1.log
stderr_logfile=/var/log/celery/worker1.log
redirect_stderr=true
autostart=true
autorestart=true
startsecs=1
stopwaitsecs=600
killasgroup=true
priority=998
; Note that I have "celeryw2" and "celeryw3" subprocess groups that are similar
; to the above except they refer to workers 2 and 3. I omitted them to save space.
[group:celery-workers]
programs=celeryw1,celeryw2,celeryw3
priority=999