Ausführen von Bash innerhalb von Cronjob

Ausführen von Bash innerhalb von Cronjob

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 bashanstelle 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.shunter Ubuntu, einem Debian-Derivat, das dashanstelle 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 rootFeld 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 topund erfasst den CPU-Benutzermodus-Prozentsatz. Es erfasst auch den zwischengespeicherten Speicherwert von free. Hier habe ich darauf verzichtet freeund 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

verwandte Informationen