Nicht ausgeführte cron-Aufträge?

Nextcloud version: 19.0.2
PHP version: 7.4

In der Einstellungs-Übersicht wird mir immer der einleitende Satz …

Einige Aufträge wurden seit Letzten Monat nicht mehr ausgeführt. Bitte erwäge die Umstellung auf System-Cron.

… angezeigt.

Im Log sehe ich nichts auf den ersten Blick, was damit zu tun haben könnte, aber da weiß ich auch nicht, wonach ich suchen müßte.

Ich habe Webcron eingestellt und die Ausführung liefert auch immer ein “Status: Success” zurück. Ich kann es auch über https://[…]/cron.php manuell aufrufen, mit demselben Ergebnis. Augenscheinlich funktioniert das cron-script also ja, aber wie finde ich raus, welche Aufträge nicht ausgeführt wurden und wie kriege ich das korrekt zum Laufen?

Grüße und Danke
Philipp

Die Meldung besagt nicht, dass es ein Problem bei der Ausführung des Cron-Skriptes gegeben hat, sondern dass es ein Problem gibt weil das Skript nicht regelmäßig ausgeführt wird.
Gemäß der aktuellen Dokumentation soll das cron-Skript alle 5 Minuten ausgeführt werden - auch wenn Du z.B. nicht über den Web-GUI am System angemeldet bist. Dies ist nur möglich wenn man einen dedizierten Cron- bzw. Webcron-Job anlegt.

Ah, OK, ich verstehe den Unterschied.

Aber: Ich habe den Webcron-Job gestern eingerichtet, und zwar wie empfohlen für eine Ausführung alle 5 Minuten. Zur Sicherheit habe ich auch den “Output per Mail” angefordert und der kommt auch alle 5 Minuten mit dem Inhalt “Status: Success”, ist also locker seitdem eine dreistellige Anzahl mal aufgerufen worden, und ich frage mich, welche Aufträge da trotzdem immer noch “nicht ausgeführt” sein könnten. Läßt sich das rausfinden und beheben?

Grüße und Danke
Philipp

Gegebenenfalls hilft hier ein Blick in die Nextcloud-Logdatei.

Da habe ich einen Blick reingeworfen und deswegen schrieb ich ja im Eingangsposting „Im Log sehe ich nichts auf den ersten Blick, was damit zu tun haben könnte, aber da weiß ich auch nicht, wonach ich suchen müßte.“ - Was sind dort Einträge, die auf fehlende Aufträge hinweisen, die cron eigentlich absolviert haben sollte?

Grüße und Danke
Philipp

Übliche Meldungen sehen bei mir z.B. wie folgt aus. Einem erfolgreich gestarteten Job folgt üblicherweise auch eine korrespondierende “Finished” Meldung. Fehlende Meldungen sind schwer zu benennen, da die im Hintergrund ausgeführten Tätigkeiten veriieren können:

... ,"app":"cron","method":"","url":"/cron.php","message":"Run OC\\BackgroundJob\\Legacy\\RegularJob job with ID 3","userAgent":"--","version":"19.0.2.2"}
... ,"app":"cron","method":"","url":"/cron.php","message":"Finished OC\\BackgroundJob\\Legacy\\RegularJob job with ID 3 in 0 seconds","userAgent":"--","version":"19.0.2.2"}


... ,"app":"cron","method":"","url":"/cron.php","message":"Run OCA\\Talk\\BackgroundJob\\RemoveEmptyRooms job with ID 500","userAgent":"--","version":"19.0.2.2"}
... ,"app":"cron","method":"","url":"/cron.php","message":"Finished OCA\\Talk\\BackgroundJob\\RemoveEmptyRooms job with ID 500 in 0 seconds","userAgent":"--","version":"19.0.2.2"}

Auch da - nix. Der einzige Eintrag, in dem cron vorkam, war hinsichtlich eines zu großen Logfiles, das umbenannt wurde.

Es scheint sich aber erledigt zu haben. In den Einstellungen wird jetzt ein grünes Label mit “Letzte Aufgabe: Gerade eben” angezeigt. Vielleicht (auch wenn der cron alle 5 min läuft) gibt es Aufgaben, die nur alle paar Tage anstehen und da waren bis vor kurzem noch nicht wieder alle abgearbeitet? Auch wenn es wundert, daß dann nicht zuerst mal alle offenen abgearbeitet werden. Und schade, daß man nirgendwo nachlesen kann, was das überhaupt für Aufgaben in welchem Intervall sind. Na gut, hat sich ja jetzt erledigt.

\phi

Es gibt in der Datenbank offenbar eine Tabelle, wo die offenen Jobs eingetragen werden. Mit folgendem SQL-Befehl seht ihr, wieviele Jobs noch offen sind:

select count(*) from oc_jobs;

Falls ihr einen anderen Prefix als oc habt, müsst ihr den natürlich ändern.

Ich vermute, das läuft wie folgt:
Bei jeder Ausführung eines Cron-Jobs, wird ein Eintrag genommen, ausgeführt und aus der Tabelle entfernt. Sobald nur noch wenige oder kein Eintrag mehr in der Tabelle vorhanden sind, verschindet die Warnung.

Bei mir sind es momentan noch über 28’000 :exploding_head:. Das könnte also noch eine Weile dauern. Ich werde wohl den Interval etwas tiefer setzen…

Falls du einen echten Cron-Befehl konfiguriert hast, könntest du mal die Anzahl der offenen Einträge ausgeben, Cron ausführen und dann noch mal schauen, inwieweit die Anzahl wirklich gesunken ist.

Ja, das habe ich natürlich gemacht. Ich führe jetzt jede Sekunde einen Job aus. Bis heute Abend sollte eigentlich alles durch sein. Bin gespannt, ob die Meldung dann auch weg ist.

1 Like

Jede Sekunde? Pass auch, dass sich das nicht hoch schaukelt.
Besser wäre eine Schleife zu programmieren.

Mit einem Cronjob ist das Hochschaukeln wohl echt ein potentielles Problem. Habe ich mir auch überlegt. Habe dann schlussendlich sowas gestartet:

for i in {1..1000}; do curl https://nextcloud.xxxxxxx.ch/cron.php; done

Läuft jetzt rund. Zum kontrollieren, ob auch wirklich was geht, kann man im Web-GUI auch einfach mit der Maus auf die Meldung fahren. Dann wird einem ja angezeigt, von wann der letzte CronJob ist. Wenn dieses Datum langsam aber sicher näher kommt, läuft der CronJob und die Meldung wird irgendwann verschwinden.

Hast du keinen direkten Shellzugriff auf deiner Nextcloud?

for i in {1..1000}; do php /path/to/nextcloud/cron.php; done

Evtl. noch ein sudo -u www-data hinzufügen oder vorher www-data werden.

for i in {1..1000}; do sudo -u www-data php /path/to/nextcloud/cron.php; done

… nicht ausprobiert …

Ich betreibe es in einem Docker-Container. Schien mir einfacher ausserhalb einen cron-Job anzulegen.
Jedenfalls ist jetzt alles wieder in Ordnung. Meldung ist weg. Alle Jobs sind ausgeführt und es wurde wohl auch einiges an Speicherplatz freigegeben. :+1:
Danke für die Hilfe. Hoffe, die Infos nützen auch anderen Leuten.

1 Like

@romixch

Kannst du mir erklären, wie du das außerhalb von docker zum laufen bekommen hast? Habe dasselbe problem. Habe die nc mit docker compose laufen…

edit: hab es nun doch selbst gelöst, mit einem cronjob.

sieht bei mir in der
crontab -e
auf dem host (nicht im container) so aus: Alle 5 Minuten wird im container (bei mir “docker_nextcloud_cron_1”) die cron.php ausgeführt.

*/5 * * * * docker exec -t -u www-data docker_nextcloud_cron_1 php -f /var/www/html/cron.php

Möge es für noch jemand hilfreich sein… :slight_smile:

2 Likes

Danke für diesen Thread. Ich hatte mich auch gewundert, warum diese Meldung nicht weggeht, aber auch bei mir hatten sich tausende Jobs angesammelt.

Trotzdem finde ich das unelegant mit dem Cronjob auf dem Host. Fühlt sich irgendwie nicht sehr Docker’ish an. Neues System aus dem Backup aufsetzen und zack: Cronjob vergessen. Irgendwie nicht Sinn der Sache finde ich.

Ich habe neben meinem Nextcloud-Container jetzt noch einen Container für das Cron-Geraffel laufen:

Dockerfile (um das Image nextcloud_cron zu bauen:

FROM alpine:latest
RUN apk add --no-cache curl
CMD while true; do echo -n `date`:" "; curl -s https://mynextcloud.tld/cron.php; echo; sleep 5m; done

Im docker-compose ist es dann easy as:

services:
  ...
  trigger-cron:
    image: nextcloud_cron
    container_name: nextcloud-cron
    restart: unless-stopped
1 Like