Ich habe einen Cron-Job, der ein Skript ausführt. Wenn ich das Skript über eine interaktive Shell (ssh'ed to bash) ausführe, funktioniert es einwandfrei. Wenn das Skript von selbst über cron ausgeführt wird, schlägt es fehl.
Ich vermute, dass dabei einige der Umgebungsvariablen verwendet werden, die in der interaktiven Shell festgelegt sind. Ich werde das Skript beheben und diese entfernen.
Nachdem ich Änderungen vorgenommen habe, weiß ich, dass ich das Skript in Cron in die Warteschlange stellen kann, damit es wie gewohnt ausgeführt wird. Es gibt jedoch eine Möglichkeit, das Skript von der Befehlszeile aus auszuführen. dh in einer nicht interaktiven Umgebung?
unset
.env
, und Sie möchten es vielleicht versuchenenv -i ./my-script.sh
. Erhalten Sie auch eine Fehlermeldung?Antworten:
Die Hauptunterschiede zwischen der Ausführung eines Befehls von cron und der Ausführung in der Befehlszeile sind:
/bin/sh
) eine andere Shell ;cron(8)
odercrontab(5)
man-Seite; im Allgemeinen gibt es nurHOME
vielleichtSHELL
vielleichtLOGNAME
vielleichtUSER
und eine kleinePATH
);%
Charakter speziell (er wird in eine neue Zeile umgewandelt);Der folgende Aufruf führt das Shell-Snippet so aus, als wäre es von cron aus aufgerufen worden. Ich gehe davon aus, dass das Snippet die Zeichen
'
oder nicht enthält%
.Siehe auch Ausführen eines sh-Skripts vom cron aus , das zur Lösung Ihres Problems beitragen kann.
quelle
sudo -u user /path/to/script
auch eine Möglichkeit sein, es ohne gesetzte Variablen auszuführen?sudo
Löscht einige Variablen und setzt andere auf einen bekannten Wert. Dies hängt jedoch von der Konfiguration ab. Es wird häufig so konfiguriertTERM
, dass beispielsweise die Gebietsschemaeinstellungen beibehalten werden .Über den Link von @ sr_ ( So erhalten Sie eine saubere Umgebung in einer ksh-Shell? ) Habe ich nach env gesucht. Vielleicht möchten Sie Folgendes versuchen:
quelle
echo -e '#!/bin/bash -i\necho interactive $-' > ~/test.sh && chmod +x ~/test.sh && env -i ~/test.sh
Ausgängeinteractive himB
.Ich würde vorschlagen, dass Sie absolute Pfade für Ihre Skripte verwenden, wenn Sie sie in cron einfügen und an anderer Stelle verwenden, und für alle darin verwendeten Linux-Befehle, deklarieren Sie sie besser als Variablen und verwenden Sie sie!
quelle
Cron verwendet nicht unbedingt dieselbe Shell, die Sie verwenden. prüfen:
Um die Shell zu bestimmen und dort die Ausführung Ihres Skripts zu versuchen - funktioniert das? Dies ist eine häufige Ursache für Probleme, wenn viele Benutzer Skripts zu cron hinzufügen.
Wenn dies das Problem ist, können Sie "bash" am Anfang Ihres Skripts in cron hinzufügen, um die Ausführung dieses Skripts in bash zu erzwingen. Wenn dies das Problem nicht löst, lassen Sie es mich wissen und ich werde etwas tiefer graben.
quelle
Wenn Sie einige interaktive Fragen, die von einem Skript bereitgestellt werden, ignorieren möchten, können Sie Folgendes versuchen:
Oder
yes "n"
wenn Sie nicht alle Fragen möchten.quelle
Um Ihr Skript in einer nicht interaktiven Shell auszuführen (ohne Rücksicht auf die Details von
cron
), können Sie dies über ausführenssh
.Testen Sie, ob Sie wirklich in einer nicht interaktiven Shell landen:
Führen Sie das Skript in einer nicht interaktiven Shell aus:
quelle