Wenn die Nextcloud-Administrationsseite meldet, dass Hintergrundprozesse in letzter Zeit nicht ausgeführt wurden, können Aufräumarbeiten, Benachrichtigungen und andere geplante Aufgaben versäumt werden. Auf einem Systemd-Server lässt sich das Problem üblicherweise beheben, indem Nextcloud cron.phpals Webserver-Konto über einen Systemd-Dienst ausgeführt und dieser Dienst anschließend mit einem aktivierten Timer geplant wird. Das aktuelle Nextcloud-Administrationshandbuch enthält ein Beispiel mit zwei Einheiten; die Pfade und das Dienstkonto müssen mit Ihrer Installation übereinstimmen.
Prüfen Sie zuerst, was nicht funktioniert.
Nextcloud-Hintergrundprozesse werden beim cron.phpAufruf ausgeführt. Ein systemd- Dienst definiert den auszuführenden Befehl; ein Timer startet diesen Dienst planmäßig. Falls der Dienst manuell gestartet wird, der Timer aber nicht auslöst, überprüfen Sie die Timer-Aktivierung. Falls der Timer auslöst, der Dienst aber fehlschlägt, prüfen Sie dessen Befehl, die PHP-Umgebung und die Berechtigungen.
Prüfen Sie vor der Bearbeitung, ob das Nextcloud-Verzeichnis und der HTTP-Benutzer korrekt sind. In diesem Beispiel wird von den Benutzerkonten `/usr/local/nextcloud` /var/www/nextcloudund `/usr/local/nextcloud` ausgegangen www-data, die unter Debian und Ubuntu üblich sind. Auf anderen Systemen kann das Konto auch `/usr/local/nextcloud`, ` wwwrun/ apacheusr/local/nextcloud` oder ein anderer Benutzer sein. Nextcloud erfordert, dass die Befehlszeilenbefehle als HTTP-Benutzer ausgeführt werden, damit die Dateibesitzverhältnisse konsistent bleiben. Weitere Informationen finden Sie in der Nextcloud-Dokumentation zu `occ` .
Testen Sie dieselbe PHP-Executable und dasselbe Cron-Skript, das systemd verwenden soll:
sudo -u www-data /usr/bin/php -f /var/www/nextcloud/cron.php
Ersetzen Sie Konto, PHP-Pfad und Nextcloud-Pfad durch die Pfade Ihres Webhosts. Falls der Befehl einen PHP-Fehler, eine fehlende Erweiterung, ein Berechtigungsproblem, den Wartungsmodus oder einen Datenbankverbindungsfehler meldet, beheben Sie dieses Problem zuerst; der Timer kann einen fehlgeschlagenen Befehl nicht reparieren.
Bestätigen Sie, dass Nextcloud den System-Cronjob verwendet.
Öffnen Sie die Administrationseinstellungen → Grundeinstellungen → Hintergrundprozesse und wählen Sie Cron aus , falls es noch nicht ausgewählt ist. Sie können diesen Befehl auch im Nextcloud-Verzeichnis ausführen:
cd /var/www/nextcloud
sudo -E -u www-data php occ background:cron
Nextcloud weist darauf hin, dass die Auswahl von Cron in den Administratoreinstellungen nicht unbedingt erforderlich ist, wenn cron.phpdas Skript über die Kommandozeile ausgeführt wird, da der Modus automatisch festgelegt wird. Die explizite Auswahl macht den gewünschten Produktionsmodus deutlich. Nextcloud empfiehlt für den Produktivbetrieb die Verwendung von System-Cron; in der Dokumentation zu Hintergrundjobs werden auch Systemd-Timer als alternativer Scheduler aufgeführt.
Repariere den systemd-Dienst
Erstellen oder aktualisieren Sie /etc/systemd/system/nextcloudcron.servicedie Datei mit folgendem Inhalt. Verwenden Sie den vollständigen Pfad zu PHP, damit systemd nicht von einer interaktiven Shell abhängt PATH.
[Unit]
Description=Nextcloud cron.php job
[Service]
User=www-data
ExecCondition=/usr/bin/php -f /var/www/nextcloud/occ status -e
ExecStart=/usr/bin/php -f /var/www/nextcloud/cron.php
KillMode=process
Wechseln Sie Userzum Webserver-Konto und den entsprechenden Pfaden zu PHP und Nextcloud. Die Bedingung prüft, ob die Instanz ordnungsgemäß funktioniert, bevor der Job ausgeführt wird. Schlägt die Bedingung fehl, kann systemd den Dienst überspringen. Prüfen Sie, ob Nextcloud im Wartungsmodus ist und überprüfen Sie das Journal, bevor Sie die Bedingung entfernen oder ändern. Behalten Sie die Konfiguration bei KillMode=process, da Nextcloud sie im Beispiel verwendet, damit externe, von cron gestartete Programme nach Beendigung des cron-Prozesses weiterlaufen können. Die Diensteinheit benötigt keinen [Install]Abschnitt.
Repariere und aktiviere den Timer
Erstellen /etc/systemd/system/nextcloudcron.timer. Dieser Zeitplan startet fünf Minuten nach dem Systemstart und wartet dann fünf Minuten nach jeder Dienstaktivierung:
[Unit]
Description=Run Nextcloud cron.php every 5 minutes
[Timer]
OnBootSec=5 min
OnUnitActiveSec=5 min
Unit=nextcloudcron.service
[Install]
WantedBy=timers.target
Laden Sie systemd neu, damit es die Unit-Dateien liest, und aktivieren und starten Sie dann den Timer mit einem einzigen Befehl:
sudo systemctl daemon-reload
sudo systemctl enable --now nextcloudcron.timer
Durch Aktivieren wird der Timer bei zukünftigen Neustarts gestartet; --nowdurch sofortiges Starten wird er gestartet. Aktivieren Sie den Dienst selbst nicht wie einen wiederkehrenden Timer. Der Timer ist die Einheit, die unter „Nextcloud“ gehört timers.target. Das aktuelle Nextcloud-Handbuch erklärt diese Intervalleinstellungen und den erforderlichen Aktivierungsbefehl; ältere Versionen des Handbuchs enthielten einen veralteten Installationsabschnitt für den Dienst, folgen Sie daher stattdessen dem aktuellen Beispiel der Einheit.
Einen fehlgeschlagenen Lauf verfolgen und die Korrektur überprüfen.
Überprüfen Sie den Status des Timers und den nächsten geplanten Lauf:
systemctl status nextcloudcron.timer
systemctl list-timers nextcloudcron.timer
Der Timer sollte „Wartend“ oder „Aktiv“ anzeigen, und in der Liste sollte die nächste Aktivierungszeit angegeben werden. Überprüfen Sie anschließend den letzten Lauf des Dienstes:
systemctl status nextcloudcron.service
journalctl -u nextcloudcron.service --since today
Ein Timer kann auch dann aktiv sein, wenn jeder Dienstlauf fehlschlägt. Überprüfen Sie daher beide Einheiten. Falls der Dienst fehlt oder systemd die Datei ablehnt, führen Sie `systemd --get` aus systemd-analyze verify /etc/systemd/system/nextcloudcron.service /etc/systemd/system/nextcloudcron.timer, korrigieren Sie den gemeldeten Syntax- oder Pfadfehler und laden Sie systemd anschließend neu. Bei einem fehlerhaften Dienstbeendigungsvorgang weist die Journalausgabe häufig auf einen ungültigen PHP-Pfad, einen falschen Benutzer, eine fehlerhafte Bedingung oder einen Nextcloud-Laufzeitfehler hin. Falls der Timer keinen nächsten Lauf hat, überprüfen Sie den genauen Timer-Dateinamen, führen Sie `systemd --get` aus daemon-reloadund bestätigen Sie, dass er mit `systemd --get` aktiviert wurde systemctl is-enabled nextcloudcron.timer.
Überprüfen Sie nach der nächsten Timer-Aktivierung erneut den Status der Nextcloud-Hintergrundprozesse. Es sollte eine aktuelle Ausführungszeit angezeigt werden, nicht etwa eine Warnung wegen veralteter Einträge. Falls Timer und Dienst erfolgreiche Ausführungen melden, die Admin-Seite aber weiterhin veraltet aussieht, überprüfen Sie die Instanzprotokolle und die vom Webserver verwendete PHP-Version. Die PHP-Version für die Kommandozeile kann sich von der Web-Laufzeitumgebung unterscheiden. Diese Konfiguration beschreibt die Systemd-Planung auf einem herkömmlichen Linux-Host. Containerisierte und Appliance-Installationen verwalten Cron möglicherweise über ihren eigenen Dienst-Supervisor. Verwenden Sie daher die von der jeweiligen Plattform unterstützte Methode, anstatt Host-Units hinzuzufügen, die nicht auf die Dateien des Containers zugreifen können.