Ein einzelner Cron-Job wird nicht ausgeführt

7

Ich habe eine Liste von Cron-Jobs.

00 21 * * * sh ~/db_backup.sh

20 21 * * * sh ~/update.sh

* 5 1 * *  sh ~/db_vacuum.sh

Der erste Job erstellt eine Sicherung einer Datenbank, die auf einem Ubuntu-Server ausgeführt wird. Dies funktioniert, wenn ich das Datum überprüfe, an dem die Sicherungsdatei zuletzt geändert wurde.

date -r db.sql

Mein dritter Cron-Job staubsaugt meine Datenbank zu Beginn eines jeden Monats. Mein Problem ist in meinem zweiten Job. Dieser Job führt mehrere URL-Rückrufe in einer von mir ausgeführten DJango-Anwendung aus:

sudo docker exec -it web_1 wget -t 0 "http://127.0.0.1:8080/admin/command1"
sudo docker exec -it web_1 wget -t 0 "http://127.0.0.1:8080/admin/command2"
sudo docker exec -it web_1 wget -t 0 "http://127.0.0.1:8080/admin/command3"
sudo docker exec -it web_1 wget -t 0 "http://127.0.0.1:8080/admin/command4"

Ich überprüfe die erwarteten Ausgaben und es scheint, dass die Datei überhaupt nicht ausgeführt wurde. Das Seltsame ist, wenn ich sie manuell mit dem folgenden Befehl ausführe:

sh ~/update.sh

Es läuft einwandfrei, gibt es einen Haken bei Wgets, die mir fehlen? Falls es nicht offensichtlich ist, zeigen die wget-Befehle auf einen Docker-Container, auf dem der Server ausgeführt wird.

AKTUALISIEREN:

Ich habe versucht, Protokolldateien als Ausgabedateien an die wget-Befehle in meiner .sh-Datei anzuhängen. Nach dem erneuten Überprüfen nach der festgelegten Ausführungszeit des Cron-Jobs befanden sich keine Protokolldateien im Verzeichnis.

Ich habe dann die aktuellen Systemprotokolle überprüft und festgestellt, dass diese Meldung im Protokoll angezeigt wurde, sobald meine .sh-Datei ausgeführt wurde.

(CRON) info (No MTA installed, discarding output)

Könnte das irgendwie zusammenhängen?

GreenGodot
quelle
Ich denke docker, das sudoPasswort ist nicht erforderlich , oder?
Kos
Das Sudo war etwas, das ich hinzugefügt habe, als ich bemerkte, dass es nicht funktionierte, um zu sehen, ob das einen Unterschied machte, es scheint nicht verwandt zu sein.
GreenGodot
Verwenden Sie den vollständigen Pfad zum Docker:/usr/bin/docker
Heemayl
1
Wenn Ihr Benutzer nicht zur dockerGruppe gehört ( grep '^docker' /etc/passwd) docker, ist das sudoKennwort erforderlich . wenn dockerdas erfordert sudoPasswort und Sie nicht hinzu , dockerum NOPASSWDin /etc/sudoersder sudoist Befehl , um die Ausführung des Skripts zu stoppen.
Kos
1
Vielleicht übersehen Sie den Punkt, an dem Cron-Jobs standardmäßig mit /bin/shusing ausgeführt werden PATH=/usr/bin:/bin. Ich glaube, dockerist woanders installiert.
Ralph Rönnquist

Antworten:

3

Ihr Problem wird sudoin Ihrem Skript verwendet. Cron kann niemals Ihr Sudo-Passwort eingeben.

Елин Й.
quelle
2

Ich stelle fest, dass Sie sh verwenden, um den Cronjob aufzurufen. Sh ist jedoch eine Teilmenge von Bash und kann Ihren Cronjob möglicherweise nicht ausführen. Auch das manuelle Ausführen der Aufgabe ist nicht unbedingt dasselbe wie das Ausführen mit cron. Bitte ändern Sie sh, um den Cronjob zu schlagen und zu sehen, was passiert.

Die Fehlermeldung zu MTA, die in der Protokolldatei angezeigt wird, bedeutet, dass kein Mail Transfer Agent installiert ist. Dies bedeutet, dass keine Software zum Senden von E-Mail-Nachrichten installiert ist. Cron versucht, E-Mail-Nachrichten zu senden, um Sie über etwas zu informieren. Es könnte eine Fehlermeldung über den fehlgeschlagenen Cronjob sein.

wie5Ooma
quelle
Ich habe den Befehl in '30 21 * * * bash ~ / update.sh 'geändert, aber immer noch kein Glück. Kann die Nachricht in der Datei in Bezug auf die MTA-Nachrichten an eine Datei anstatt an eine E-Mail weitergeleitet werden?
GreenGodot
Sie können die Nachricht an eine Datei weiterleiten, indem Sie den Cronjob folgendermaßen ändern: 20 21 * * * sh ~ / update.sh >> / path / to your / file.log 2> & 1 Ändern Sie den Pfad und den Dateinamen nach Ihren Wünschen und Der Befehl sollte natürlich in einer Zeile stehen. Stellen Sie sicher, dass cron über Zugriffsrechte für diese bestimmte Datei verfügt. In der Regel sollte cron diese Rechte jedoch automatisch haben.
wie5Ooma