
Ich lasse diesen Cronjob jede Minute laufen
*/1 * * * * root sh /test.sh
Mein /test.sh protokolliert das Ergebnis der Befehle „top“ und „free“. Es funktioniert einwandfrei, wenn ich es manuell auf dem Terminal mit „sh /teste.sh“ ausführe und die Ausgabe in einer schönen Datei speichert. Wenn jedoch der Cron-Job ausgeführt wird, wird nur das Ergebnis des Befehls „free“ unten gespeichert. Überprüfen Sie dies bitte:
printf "\n" >> "log_lojar_top_free.txt"
printf %s "$(date)" >> "log_lojar_top_free.txt"
printf '\t' >> "log_lojar_top_free.txt"
top -b -n 3 -d 1 | grep "Cpu" | tail -n 1 | awk '/^%Cpu\(s\)/ {printf $2}' >> "log_lojar_top_free.txt"
printf '\t' >> "log_lojar_top_free.txt"
free | awk '/^Mem:/ {printf $7}' >> "log_lojar_top_free.txt"
Welcher Fehler führt dazu, dass nur die Ausgabe der letzten Zeile (frei) protokolliert wird?
Antwort1
Versuchen Sie, wie von anderen vorgeschlagen, den Bash-Shebang in Ihrem Skript oder Präfix direkt zu verwenden, indem Sie bash
anstelle von verwenden sh
. Da ich nicht weiß, welches System Sie tatsächlich verwenden, hatte ich kürzlich Probleme beim Aufrufen eines Skripts /bin/sh -c myscript.sh
unter Ubuntu, einem Debian-Derivat, das dash
anstelle von verwendet bash
.
Vielleicht ist dies der Schlüssel zu Ihrem Problem.
BEARBEITEN: Ich habe es mit diesem Crontab-Eintrag zum Laufen gebracht, als Root erstellt mit crontab -e
:
*/1 * * * * /bin/bash -c "/test.sh"
Antwort2
Diese Version funktioniert bei mir. Da Ihr eigenes Skript hier jedoch auch funktioniert, bin ich nicht ganz sicher, ob dies Ihr Problem beheben wird.
Systemweiter Crontab-Eintrag (lassen Sie das root
Feld weg, wenn es sich um Roots eigene Crontab handelt, auf die mit zugegriffen wird crontab -e
):
* * * * * root /root/test.sh
Soweit ich das feststellen kann, verwendet Ihr Skript die dritte Iteration von top
und erfasst den CPU-Benutzermodus-Prozentsatz. Es erfasst auch den zwischengespeicherten Speicherwert von free
. Hier habe ich darauf verzichtet free
und denselben Wert aus der dritten Iteration von extrahiert top
. Kopieren Sie dieses Skript nach /root/test.sh (und machen Sie es ausführbar):
#!/bin/bash
top -b -n 3 -d 1 |
awk -v date="$(date)" '
/^%Cpu/ {cpu=$2}
/cached Mem/ {cached=$9}
END {printf "\n%s\t%s\t%s", date, cpu, cached}
' >> /root/log_lojar_top_free.txt
Machen Sie das Skript ausführbar:
chmod +x /root/test.sh