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 und cut 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

War es hilfreich?

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)"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top