Die Ausgabe von top wird auf 80 Spalten abgeschnitten, wenn sie von cron ausgeführt wird

8

Ich habe das folgende Protokollierungsskript:

#!/bin/bash
top -b -c -n 1 >> /var/log/toplog/top.log

Und die folgende Aufzeichnung in meiner Crontab:

*/1 * * * *     /home/clime/scripts/toplog.sh

Das Problem ist, dass die Zeilen in top.log auf 80 Zeichen gekürzt werden, z.

 1512 root      20   0 80756 1436  572 S  0.0  0.1   0:05.92 /usr/libexec/postfi

Dies passiert nicht, wenn ich den Befehl direkt von der Konsole aus ausführe.

Ich habe versucht, die Variable COLUMNS zu verwenden:

*/1 * * * *     COLUMNS=999 /home/clime/scripts/toplog.sh

Aber das führt dazu, dass jede Zeile genau 999 Zeichen lang ist - unbenutztes Leerzeichen wird mit Leerzeichen aufgefüllt, was ich nicht möchte.

Wie kann ich dieses seltsame Problem beheben? Mein System ist Centos 6.3.

Klima
quelle
Ich weiß nicht, ob dies relevant ist, aber worum geht es /1? Funktioniert es, wenn Sie einfach verwenden * * * * *? */1und *beide bedeuten jede Minute laufen.
Terdon
Ye, /1muss nicht da sein. Ich habe es geändert. Das Problem besteht jedoch weiterhin.
Klima

Antworten:

8

topZeigt immer Leerzeichen bis zur letzten Bildschirmspalte an. Sie erkennen es einfach nicht, wenn auf dem Terminal gedruckt wird, da Sie eine Zeile mit nachgestellten Leerzeichen nicht visuell von einer Zeile ohne nachfolgendes Leerzeichen unterscheiden können. Sie werden die Leerzeichen bemerken, wenn Sie mit der Maus oder in kopieren und einfügen screen.

Wenn Sie die Leerzeichen entfernen möchten, filtern Sie sie einfach weg.

COLUMNS=9999 top -b -c -n 1 | sed 's/  *$//' >>/var/log/toplog/top.log

Was auch immer Sie suchen top, es gibt wahrscheinlich weitaus bessere Überwachungstools .

Gilles 'SO - hör auf böse zu sein'
quelle
1
Ich verwende dies, um Informationen über Prozesse zu speichern, die in den letzten fünf Tagen jederzeit ausgeführt wurden. Dies sind 1-Minuten-Schnappschüsse, damit etwas verloren geht, aber ich denke, es ist gut genug für mich. Ich möchte einige Daten zur Verfügung haben, wenn ich feststelle, dass die Ressourcennutzung einen Spitzenwert aufweist (dafür verwende ich Munin). Ich habe keinen besseren Weg gefunden, um vergangene Prozesse im Auge zu behalten (versucht psacct).
Klima
Ich habe dies gerade gesehen, als ich ein Überprüfungsskript über nrpe ausgeführt habe. Die Ausgabe von pswurde auf 80 Zeichen gekürzt und ein Grep für den Prozessnamen schlug fehl. Durch das Festlegen von SPALTEN wurde das Problem behoben.
Phil-Lavin
0

Ich hatte ein ähnliches Problem. Das Bash-Skript funktionierte gut über die Befehlszeile, aber die 'Top'-Ausgabe wurde beim Ausführen von Cron auf 80 Zeichen reduziert.

Ich habe hier zuerst die akzeptierte Lösung ausprobiert, indem ich die Umgebungsvariable COLUMNS festgelegt habe. Ich konnte das nicht zum Laufen bringen (SLES 12.1). Ich habe sogar versucht, in eine Datei zu schreiben, zu exportieren und ein benutzerdefiniertes Quellprofil zu erstellen.

Was funktionierte, war die Verwendung der Option -w von top.
Hier ist der Mut meines Skripts, abzüglich der Benachrichtigung und des Tötens von Sicherheitsvorkehrungen.

#!/usr/bin/sh

PROC_FOUND=""
MAX_CPU=0

RETVAL="$(top -bc -n 1 -w 512 | tail -n+8 | awk -v cpulimit=$MAX_CPU '{if ($9>=cpulimit) print $1 " " $9 " " $12; }')"

IFS='
'
set -f
for line in ${RETVAL}; do
{
        echo "found [$line]" > /dev/tty

        IFS=', '
        read -r -a array <<< "$line"
        #echo "array is ... ${array[*]}"
        PID_VAL=${array[0]}
        CPU_VAL=${array[1]}
        PROC_FOUND=${array[2]}

        echo "Monitored a High CPU for process [${PROC_FOUND} ${PID_VAL}] on "${HOSTNAME}" where ${CPU_VAL}% >= ${MAX_CPU}%."
}
done
set +f
unset IFS
exit
Colin
quelle