Blog

Wie man Container-Hintergrundaufgaben mit Cron ausführt

Laurens Knoll

Aktualisiert Oktober 21, 2025
2 Minuten

Vor kurzem habe ich an einer PHP-Anwendung gearbeitet, die Cron für die Hintergrundverarbeitung verwendet. Da es einige Zeit gedauert hat, bis ich es richtig hinbekommen habe, möchte ich die Lösung mit Ihnen teilen.

Cron Hintergrund

Cron führt Befehle nach einem zeitbasierten Zeitplan mit einer minimalen Umgebung aus. Die Befehle werden in crontab-Dateien definiert. Diese Dateien verwenden ein strenges Format, das einen Zeilenumbruch enthält und die Dateiberechtigung 0644 erfordert.

Cron in einem Container ausführen

Bei dieser Lösung wird Cron als sekundärer Prozess in einem PHP-Webserver-Container ausgeführt. Supervisor kontrolliert diese Prozesse und sorgt dafür, dass der Container ausfällt, sobald ein Prozess ausfällt.

Alle Lösungsquellen finden Sie auf GitHub.

Die Dockerdatei setzt die erforderlichen Berechtigungen für die crontab-Datei und startet Supervisor.

FROM ubuntu:18.04

ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update -y && 
    apt-get install -y --no-install-recommends cron supervisor

# Configure cron jobs and ensure crontab-file permissions
COPY cron.d /etc/cron.d/
RUN chmod 0644 /etc/cron.d/*

COPY supervisord.conf /etc/supervisor/
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]

Supervisor startet Cron mit der folgenden Konfiguration.

[program:cron]
command = /bin/bash -c "declare -p | grep -Ev '^declare -[[:alpha:]]*r' > /run/supervisord.env && /usr/sbin/cron -f -L 15"
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes=0
user = root
autostart = true
autorestart = true

Cron läuft im Vordergrund(cron -f), damit der Supervisor es kontrollieren kann.

Die Prozessumgebung des Supervisors wird nach /run/supervisord.env exportiert. Dies ermöglicht es Cron-Jobs, die Docker/Kubernetes-Umgebungsvariablen zu importieren. Die Umgebung wird zum Beispiel von dem folgenden Cron-Job importiert.

* * * * * www-data exec /bin/bash -c ". /run/supervisord.env; /app/script.sh >> /app/cron.log"

Diskussion

Die Verarbeitung im Hintergrund ist alltäglich, aber nicht trivial. Wie werden die Ausführungen verfolgt? Wie wird sie skaliert? Wie werden Neustarts gehandhabt? Cron zum Beispiel hilft bei keinem dieser Probleme.

Die bereitgestellte Lösung ist Teil einer Anwendung Replatform. Für einen zukünftigen Refactor streben wir an, Cron durch Kubernetes Cron oder einen anderen modernen Scheduler zu ersetzen. Ziehen Sie also bitte moderne Scheduler-Alternativen für Ihre Dienste in Betracht.

Versuchen Sie es selbst

Klonen Sie das zugehörige GitHub-Repository und probieren Sie es aus!

git clone git@github.com:binxio/blog-cron-supervisor-docker.git
docker build -t cron-supervisor-example .
docker run --rm -p 8080:8080 cron-supervisor-example

Lesen Sie mehr?

Wenn Sie serverlose asynchrone Verarbeitung benötigen, lesen Sie unseren Blog über Google Cloud Tasks und die Planung von serverlosen Anwendungen mit Cloud Scheduler.

Foto von JESHOOTS.COM auf Unsplash

Verfasst von

Laurens Knoll

As a cloud consultant I enjoy improving what your company does best. I enable your business using cloud technology and enable your engineers by applying software engineering practices to your infrastructure domain.

Contact

Let’s discuss how we can support your journey.