2016-08-01 20 views
2

Ich habe einfache Bash-Skript, das Handbuch am Terminal, aber nach Cron gibt eine leere Variable.Bash leere Variable nach dem Ausführen von Cron, aber läuft manuell

#!/bin/bash 
gwip=`/usr/bin/nmcli dev list iface eth0 | grep IP4-SETTINGS.GATEWAY: | awk '{ print $2}'` 
printf '%s\n' "$(date) =- $gwip -= " >> /var/log/looog.log 

Lauf: /bin/bash /test.bash

Ausgabe in Datei /var/log/looog.log:

1 monday 2016 14:17:36 +0300 =- 23.18.117.254 -= 

Wenn ich durch cron, variabel ist leer.

*/1 * * * * root /bin/bash /test.bash 

Ausgabe in Datei /var/log/looog.log:

1 monday 2016 14:19:13 +0300 =- -= 

Warum variable $ gwip ist leer? wie man es repariert?

Antwort

3

Qualifizieren /usr/bin/nmcli ist nicht genug - Sie rufen eine Reihe von anderen Tools, die auch von der PATH gefunden werden müssen.

Auch im Allgemeinen - wenn Sie einen cron-Job debuggen, arrangieren für seine stderr in eine Datei zu gehen, etwa so:

#!/bin/bash 

# log stdout and stderr to two different files 
exec >>/var/log/looog.log 2>>/var/log/looog.err.log 

# ...and log every command we try to execute to stderr (aka looog.err.log) 
set -x 

# set a PATH variable 
export PATH=/bin:/usr/bin 

# original code here, using modern POSIX $() syntax, vs old hard-to-nest `` 
gwip=$(nmcli dev list iface eth0 | awk '/IP4-SETTINGS[.]GATEWAY:/ { print $2}') 
printf '%s\n' "$(date) =- $gwip -= " 

Die wichtigsten Dinge sind hier die explizit gesetzt PATH (nicht der erwartete Wert in PATH ist ein häufiges Problem in Cron-Jobs) und das stderr-Protokoll (das sicherstellt, dass alle anderen Probleme durch Lesen seines Inhalts identifiziert werden können).

Beachten Sie die Verwendung einer einzelnen Umleitung zu looog.log im Voraus. Dies macht keinen signifikanten Unterschied, wenn Sie buchstäblich nur eine Druckanweisung ausführen. Wenn Sie dieses Skript jedoch auf mehrere erweitert haben, ist es effizienter, die Ausgabedatei nur einmal zu öffnen, als sie alle erneut zu öffnen Zeit hast du etwas zu schreiben.

+0

Ich habe einen Fehler in looog.err.log: ** (Prozess: 11885): WARNUNG **: nm_client_get_devices: Fehler beim Abrufen der Geräte: Keine Antwort erhalten. Mögliche Ursachen sind: Die Remoteanwendung hat keine Antwort gesendet, die Nachrichtenbus-Sicherheitsrichtlinie hat die Antwort blockiert, das Antwortzeitlimit ist abgelaufen oder die Netzwerkverbindung wurde unterbrochen. Fehler: Gerät 'eth0' nicht gefunden. –

+1

Nun, da ist dein Fehler. Warum 'nmcli' nicht von Cron auf Ihrem System läuft, ist nicht wirklich eine großartige StackOverflow-Frage - es wird notwendigerweise eine faktenintensive Untersuchung sein - aber ich würde anfangen, zu prüfen, ob Sie SELinux aktiviert haben. Wenn Sie es auf den Modus "Permissive-but-logging" (Freigeben, aber nicht protokollieren) festlegen, können Sie so herausfinden, welche Berechtigungen benötigt, aber nicht verfügbar sind. –

+0

... dieser Fehler macht es ziemlich klar, dass Bash so funktioniert, wie es sollte, sogar von Cron, und damit haben Sie kein Problem mit der Variablenerfassung, richtig? Gibt es hier noch weitere Teilbereiche des Problems? –