
Ich habe das folgende Protokollierungsskript:
#!/bin/bash
top -b -c -n 1 >> /var/log/toplog/top.log
Und folgender Eintrag in meiner Crontab:
*/1 * * * * /home/clime/scripts/toplog.sh
Das Problem besteht darin, dass Zeilen in top.log auf 80 Zeichen gekürzt werden, zB:
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
Das führt allerdings dazu, dass jede Zeile genau 999 Zeichen lang ist – ungenutzter Platz wird mit Leerzeichen aufgefüllt, und das möchte ich nicht.
Wie behebe ich dieses seltsame Problem? Mein System ist CentOS 6.3.
Antwort1
top
zeigt immer Leerzeichen bis zur letzten Bildschirmspalte an. Sie bemerken es nur nicht, wenn es auf dem Terminal gedruckt wird, da Sie eine Zeile mit nachstehenden Leerzeichen optisch nicht von einer Zeile ohne nachstehende 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 loswerden 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 anstreben top
, es gibt wahrscheinlich weitaus bessereÜberwachungWerkzeuge verfügbar.
Antwort2
Ich hatte ein ähnliches Problem. Das Bash-Skript funktionierte von der Befehlszeile aus einwandfrei, aber die „oberste“ Ausgabe wurde beim Ausführen von Cron auf 80 Zeichen gekürzt.
Ich habe zuerst die hier akzeptierte Lösung ausprobiert, indem ich die Umgebungsvariable COLUMNS gesetzt habe. Ich konnte das nicht zum Laufen bringen (SLES 12.1). Ich habe sogar versucht, in eine Datei zu schreiben, zu exportieren, ein benutzerdefiniertes Quellprofil zu erstellen.
Was funktioniert hat, war die Verwendung der Option -w von top.
Hier ist der Kern meines Skripts, abzüglich der Benachrichtigungen und Sicherheitsbedenken.
#!/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