Ich habe zwei Server in meinem Netzwerk und übertrage einige Daten von einem Server auf den anderen. Ich habe ein Skript geschrieben, um dies zu erreichen, und es funktioniert einwandfrei, wenn ich es manuell ausführe. Wenn ich es jedoch in crontab einbinde, um den Vorgang zu automatisieren, wird der externe Server nicht gemountet, obwohl das Skript ausgeführt wird. Ich sende so viele Informationen wie möglich an ein Protokoll, aber es werden keine Mount-Fehler gemeldet, nur die Tatsache, dass keine Verbindung hergestellt wurde.
Dies ist das Skript:
#!/bin/bash
LOGFILE="/var/log/SRV1.log"
echo $(date +%Y-%m-%d_%H:%M:%S)" --- Begins Now" | tee -a ${LOGFILE}
StartTime="$(date +%s)"
echo "Connecting to SRV1" | tee -a ${LOGFILE}
mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}
Eigentümer der Datei ist root:root mit der Berechtigung 755. (Ich weiß, dass ich das einschränken könnte, aber ich experimentiere noch immer.)
Antwort1
Das cron
Programm läuft in einer sehr eingeschränkten Umgebung. Das sieht man zum Beispiel, wenn man eine Crontab erstellt, die enthält
* * * * * /usr/bin/printenv > /tmp/cronenv
und schauen Sie sich dann die resultierende Datei an:
$ cat /tmp/cronenv
LANGUAGE=en_CA:en
HOME=/home/steeldriver
LOGNAME=steeldriver
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
SHELL=/bin/sh
PWD=/home/steeldriver
Dasselbe gilt für root
Crontabs (also Jobs, die mit übermittelt werden sudo crontab -e
):
LANGUAGE=en_CA:en
HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
SHELL=/bin/sh
PWD=/root
Insbesondere PATH
enthält der Standardwert nur /bin
und /usr/bin
; das wäre in Ordnung für mount
:
$ which mount
/bin/mount
das wird jedoch zum Beispiel nicht funktionieren mount.cifs
, da es sich in folgendem befindet /usr/sbin
:
$ which mount.cifs
/sbin/mount.cifs
Die Lösung ist entweder:
Verwenden Sie für ausführbare Programme in Skripten, die als Cron-Jobs ausgeführt werden sollen, immer den vollständigen absoluten Pfad. Beispiel:
/usr/sbin/mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}
oder
PATH
Fügen Sie am Anfang solcher Skripte eine entsprechende Zuordnung hinzu, z. B.PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HINWEIS: Für Jobs, die aus dem Systemverzeichnis ausgeführt werden, /etc/cron.d
ist ein ausführlicherer Pfad explizit festgelegt in /etc/crontab
:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin