Crontab-Skript in einem anderen Verzeichnis funktioniert nicht

Crontab-Skript in einem anderen Verzeichnis funktioniert nicht

Ich habe versucht, meine Codebasis täglich mit dem folgenden Crontab-Befehl zu aktualisieren. Aber der erste Schritt selbst funktionierte nicht, als ich ihn testete.

27 15 * * * . cd /home/covuser/user/ && . /home/covuser/user/conf.sh
40 17 * * * . cd /home/covuser/user && . /home/covuser/user/checkout.sh

conf.sh enthält die Umgebungsvariable, die zum Auschecken des Codes erforderlich ist. Die Datei checkout.sh führt den Auscheckvorgang durch.

Die erste Zeile soll die erforderliche Umgebungsvariable festlegen. Dies geschieht jedoch nicht.

Welchen Fehler haben Sie dabei gemacht? Vielen Dank im Voraus.

Antwort1

Jede Zeile in Ihrer Crontab stellt einen separaten Job dar, der unabhängig geplant und ausgeführt wird.

Das bedeutet in Ihrem Fall insbesondere, dass sie in unterschiedlichen Shell-Sitzungen ausgeführt werden, sodass das Einbinden einer Skriptdatei zum Festlegen einiger Umgebungsvariablen in einem Job keine Auswirkungen auf die Umgebung hat, in der später ein anderer Job ausgeführt wird.

Sie müssten Ihren Prozess ändern und beide Skripte innerhalb derselben Shell-Sitzung und daher am einfachsten im selben Cron-Job ausführen.

Wenn Sie eine Verzögerung zwischen den Läufen benötigen, können Sie dies beispielsweise erreichen, indem Sie sleepstatt dessen einen anderen Job zu einem späteren festen Zeitpunkt planen.


Oh, und natürlich können Sie, wie in einigen anderen Kommentaren und Antworten erwähnt, Skripte nur mit als Quelle verwenden, .damit sie in der aktuellen Shell-Umgebung und nicht in einer Subshell ausgeführt werden. cdist jedoch kein Skript, sondern ein integrierter Shell-Befehl, der ohnehin immer in der aktuellen Shell-Umgebung ausgeführt wird, sodass das Schreiben . cd somehwereebenfalls einen Fehler darstellt.

Antwort2

Ich glaube, das Problem liegt an .Ihrem vorangegangenen cd.

.(alias fro source) ermöglicht Ihnen, eine Datei als Quelle zu verwenden. Dies funktioniert nicht für Shell-Builtins wie cd, da es sich dabei nicht um ausführbare Dateien handelt, die als Quelle verwendet werden können.

Wenn Sie die beiden Befehle mit einem AND - verknüpfen &&, überspringt die Shell alle Befehle, die auf einen fehlgeschlagenen Befehl folgen, da sie den resultierenden Ergebniswert ( false && true == false) nicht ändern. Sie können das &&durch ein ersetzen ;, wenn Sie ein anderes Verhalten wünschen.

Das sollte funktionieren :

27 15 * * * cd /home/covuser/user/ && . /home/covuser/user/conf.sh
40 17 * * * cd /home/covuser/user && . /home/covuser/user/checkout.sh

Aktualisieren: Wenn die Skripte abhängig sind (was sie meiner Meinung nach sind), führen Sie alles in einer einzigen Sitzung aus. (Zum Ausführen jedes Cron-Eintrags wird eine neue Bash-Sitzung geöffnet.)

27 15 * * * cd /home/covuser/user/ && . /home/covuser/user/conf.sh && . /home/covuser/user/checkout.sh

verwandte Informationen