
Ich versuche, die Ursache für eine zeitweilige CPU-Auslastungsspitze in einem Server mit dem Befehl „watch -n .5 "ps aux | sort -rk 3,3 | head -n 2"“ zu ermitteln. Dabei wird alle 0,5 Sekunden der Prozess mit der höchsten CPU-Auslastung angezeigt.
Da es jedoch schwierig ist, es zu erfassen (das Ereignis ist zufällig und ich habe keine Ahnung, wie lange es dauert), möchte ich Folgendes tun: 1. Das Intervall reduzieren (um die Chance zu erhöhen, das Ereignis zu erfassen) und die Ausgabe in eine Datei schreiben. 2. Da der oberste Prozess normalerweise ohnehin konstant ist, möchte ich nur schreiben, wenn zwischen zwei nachfolgenden Ausgaben ein Werteunterschied besteht (z. B. wenn der CPU-Spitzenwert auftritt), um die Erstellung einer so großen Datei zu vermeiden.
Danke!
Antwort1
Vergessen Sie die Uhr, das hier sollte zumindest theoretisch funktionieren:
while true; do
# I cut the header first with tail
cat file <(ps aux | tail -n +2 | sort -rk 3,3 | head -n 2) | sort | uniq | sponge file
# A certain amount of delay
sleep 0.1
done
Das einzige Problem besteht darin, dass die CPU-Auslastung jedes Prozesses im Laufe der Zeit variiert und Sie insbesondere die CPU-Auslastung ermitteln möchten. Der Effekt uniq
ist daher sehr begrenzt und es werden trotzdem große Datenmengen erzeugt. Sie können verwenden, cut
um die für Sie unwichtigen Variablen zu unterdrücken, damit ihre Variation die Anzahl der erzeugten Datenpunkte nicht erhöht.