Ich habe ein Skript, das funktioniert, wenn ich es über die Befehlszeile ausführe, aber wenn ich es mit cron
plane, erhalte ich die Fehlermeldung, dass es keine Dateien oder Befehle finden kann. Meine Frage ist zweifach:
Wenn ich einen Cron-Job mit terminiere
crontab -e
, verwendet er meine Benutzer-ID als Grundlage für seine Berechtigungen? Oder verwendet es eine Cron-Benutzer-ID und die damit verbundenen Berechtigungen?Was ist das Arbeitsverzeichnis, wenn ein Cron-Job gestartet wird? Ist es das Verzeichnis, in dem ich das auszuführende Skript spezifiziere, oder ein anderes Verzeichnis?
Hier ist mein Cron Job:
15 7 * * * /home/xxxx/Documents/Scripts/email_ip_script.sh
Hier ist das aktuelle Skript:
vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
sed "s/IPADDR/$vIP_ADDR/g" template.txt > emailmsg.txt
ssmtp [email protected] < emailmsg.txt
Folgende Fehler werden beim Anzeigen der mail
Nachricht angezeigt, die von cron
:
sed: can't read template.txt: No such file or directory
/home/xxxx/Documents/Scripts/email_ip_script.sh: line 15: ssmtp: command not found
Es kann das nicht finden, template.txt
aber es befindet sich im selben Verzeichnis wie das Skript. Es kann auch nicht laufen ssmtp
, aber ich kann als mein Benutzer. Was fehlt mir, damit das richtig funktioniert?
quelle
cron
es ein eigenesPATH
oder kann ich das meines Benutzers überprüfenPATH
? Ich habe ssmtp bis haben seine eigeneuser
und diewheel
Erlaubnis dachte , es würde jemand erlauben , es zu benutzen (einschließlich cron). Wenn es hilft Im auf CENTOS 6.2ssmtp
, sondern dass Ihr Cron-Job keine aufgerufene ausführbare Datei findet,ssmtp
weil sie nicht in Ihrer istPATH
. Es gibt keinen "BenutzerPATH
"; Dies ist eine Einstellung pro Prozess, keine Einstellung pro Benutzer. Sie können den Pfad für alle Ihre Cron-Jobs festlegen, indem Sie einePATH=…
Linie in Ihre Crontab einfügen.´which ssmtp´ ...
type ssmtp
Wenn es sich bei Ihrem Cronjob um ein Bash-Skript handelt, wird Folgendes an den Speicherort Ihres Skripts kopiert (vorausgesetzt, Sie verwenden in Ihrer Cron-Definition den absoluten Pfad):
quelle
Zur Beantwortung von Frage 1: Wenn Sie
crontab -e
als eigener Benutzer ausgeführt werden, werden die Jobs in der crontab dieses Benutzers eingeplant und daher mit den Berechtigungen dieses Benutzers ausgeführt.Sie müssen jedoch berücksichtigen, dass die Jobs in einer nicht interaktiven Shell ausgeführt werden. Dies bedeutet, dass sich $ PATH möglicherweise von dem unterscheidet, den Sie beim Ausführen des Skripts über die Befehlszeile haben.
Es ist am besten, in Skripten immer vollständige Pfade zu verwenden, insbesondere wenn Sie planen, diese über at / cron usw. zu planen.
Ich würde auch empfehlen, vollständige Pfade zu allen Dateien zu verwenden, um genau die Probleme zu vermeiden, die Sie sehen.
Um Rennbedingungen und andere Sicherheitsprobleme zu vermeiden, sollten Sie auch
mktemp
sicherstellen, dass die gelesene Datei durch nichts außerhalb Ihres Skripts geändert wird.Also würde ich das Skript in etwas ändern wie:
quelle
cron
führt die geplanten Jobs jedes Benutzers als dieser Benutzer aus. Dies sollte ausreichen, damit wir feststellen können, dass Ihre Skripte im Verhältnis zu Ihrem Home-Verzeichnis ausgeführt werden.Wenn Sie es von einem anderen Ort ausführen müssen, verwenden Sie einfach
cd
in Ihrem Skript, um zu diesem Ort zu gelangen.ssmtp
ist wahrscheinlich nicht incron
der Standardeinstellung von PATH enthalten (auf den meisten Plattformen ist der Wert von vornherein sehr eng eingestellt). Sie können entweder den vollständigen Pfad zussmtp
in Ihrem Skript angeben oder Sie können PATH explizit in a) Ihrer crontab-Datei festlegen, die für alle Ihre Skripte verfügbar sein wird, oder b) in jedem Skript.quelle
Überprüfen Sie in diesem Thread, wie Sie die Umgebung von cron auf einfache Weise herausfinden können. Es ist viel weniger als in einer interaktiven Shell üblich. Nehmen Sie am besten an, dass nichts festgelegt wurde, und legen Sie es explizit selbst fest.
quelle
Das Standardarbeitsverzeichnis für die
cron
Ausführung des Jobs ist normalerweise das Basisverzeichnis/home/your-user-name
.Annahme @ Kusalananda ausgezeichneten Kommentar.
quelle
/home
ist alles andere als universell./home
./Users
und historische Unices verwenden/usr
, und selbst unter Linux kann sich das Home-Verzeichnis eines Systembenutzers irgendwo darunter/var
oder anderswo befinden.Einige Leute haben es angedeutet oder verlinkt, aber der beste Weg, es herauszufinden, da ich es in den Man Docs für meine Distribution nicht finden kann, ist, es einfach einem Cron hinzuzufügen
In meinem Fall verwendet Ubuntu standardmäßig nur das,
/usr/bin:/bin
was einige Probleme verursacht hat.quelle