Eval variable andernfalls (w / Crontab)
Frage
Hier ist ein Ausschnitt aus einem Bash-Skript schreibe ich CPU-Last zu protokollieren:
#!/bin/bash
# ... irrelevant nonsense ...
cmd1="/usr/bin/mpstat -P ALL | egrep '(AM|PM)([[:space:]]+)(0)' | tr -s ' ' | cut -d' ' -f4"
ldsys="$(echo $cmd1 | /bin/sh)"
# ... irrelevant nonsense ...
$ldsys
richtig eingestellt ist, wenn das Skript in herkömmlicher Weise von der Konsole ausgeführt wird. Es ist golden. Hier ist die Frage:. , wenn sie mit crontab ausgeführt, $ldsys
ist leer
Ich habe Millionen von Dingen, für die letzten drei Stunden damit, zu versuchen, diese Sache Arbeit zu bekommen ... aber ich kann nicht finden alles . Hat jemand irgendwelche Ideen?
Weitere Informationen:
-
/usr/bin/mpstat
können durch ausgeführt werden cron. Getestet habe ich durch eine gefälschte Aufgabe Hinzufügen jede Minute zu feuern:/usr/bin/mpstat -P ALL >> somefile
und die Ausgabe zu überprüfen. Es funktioniert. -
egrep
,tr
undcut
alle Funktion fein unter cron. -
Ich denke, es ist wirklich mit der eval Zuordnung Konvention zu tun hat ... aber ich weiß nicht, warum das wäre ein Problem sein, wenn man bedenkt es ein relativ grundlegendes Konstrukt ist ...Nach Adams Vorschlag versucht, ich habe jetzt keine Ahnung, was ... denken
Edit:. gezupft eval
Nutzung ... noch keine Würfel
Lösung
Ihr Problem von mpstat
kommt. Wenn es von der Eingabeaufforderung ist, gibt er die Zeit mit AM / PM. Es ist nicht, wenn sie von cron
laufen gelassen. ennuikiller vorgeschlagen, es ist wahrscheinlich ein Umweltproblem. Auf meinem System echo $LANG
gibt „en_US.UTF-8“ an der Eingabeaufforderung, aber nichts, wenn in cron
laufen. Diese oder eine andere Umgebungsvariable ist die Art und Weise mpstat
Ausgänge Zeiten beeinflussen so, wenn Sie grep
für „(AM | PM)“. Es es nicht findet
By the way, warum Sie nicht einfach tun:
ldsys=$(/usr/bin/mpstat ... )
ohne die Zuordnung zu "cmd1", die eval
, die echo
und die Rohrleitung zu sh
?
Andere Tipps
Sie begegnen einer der beiden folgenden Themen:
This is perhaps our number one complaint with cron. When you login to Unix, startup scripts setup your environment. You can see your environment with the commands "printenv" or "env". On the other hand, cron sets up only a sparse environment
Normalerweise wird der Ausgang eines jeden Programms zu STDOUT (standard out) gesendet wird, und windet sich in der Regel auf jemandes Bildschirm nach oben. Für Jobs von cron gestartet wird STDOUT an dem lokalen Mail-Subsystem gerichtet werden, das jede Ausgabe durch einen cron-Job generierte bedeutet für die Benutzer versandt besitzen den Job
Haben Sie die eval
versucht zu beseitigen?
Anstelle von
ldsys=`eval $cmd1`
Versuchen
ldsys=`echo "$cmd1" | /bin/sh`
oder
ldsys="$(echo $cmd1 | /bin/sh)"