Geben Sie das Shell-Skript frei, das zur regelmäßigen Überwachung des Prozesses mit dem Befehl top erstellt wurde. Insbesondere ist es so einfach, das Ausführungsergebnis des Befehls top in einer while-Schleife in der Protokolldatei auszugeben.
Geben Sie zunächst das Ausführungsergebnis des Befehls top als Beispiel für ein Shell-Skript frei.
$ top -n 1
top - 00:58:08 up 55 min, 1 user, load average: 0.67, 0.58, 0.64
Tasks: 329 total, 1 running, 328 sleeping, 0 stopped, 0 zombie
%Cpu(s): 4.6 us, 0.8 sy, 0.0 ni, 93.1 id, 0.0 wa, 0.0 hi, 1.5 si, 0.0 st
MiB Mem : 15662.8 total, 9716.0 free, 2467.8 used, 3478.9 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 11582.7 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9095 gkz 20 0 4616108 107196 70536 S 25.0 0.7 0:00.37 chrome
2487 gkz 20 0 4730532 335940 156620 S 6.2 2.1 2:42.61 gnome-shell
4102 gkz 20 0 321656 12708 11268 S 6.2 0.1 0:05.56 ibus-engine-moz
7243 gkz 20 0 961388 52248 37448 S 6.2 0.3 0:05.53 gnome-terminal-
1 root 20 0 168164 11936 8272 S 0.0 0.1 0:10.67 systemd
Der Befehl top kann die Anzahl der Bildschirmaktualisierungen (Frame?) Mit der Option n begrenzen. In diesem Artikel übergeben wir das Ergebnis des Befehls top in einer Pipe und schränken das Ausgabeergebnis eines bestimmten Prozesses mit grep ein, um die CPU-Auslastung eines Prozesses regelmäßig zu überwachen.
toploop.sh
#!/bin/bash
# debug mode
# bash -x toploop.sh $process
# your monitored process, e.g. dockerd
process=$1
starttime=`date +"%Y%m%d_%H%M%S"`
filename=`echo "log/top.log.$process.$starttime"`
while true
do
sleep 5
output=`top -n 1| grep $process`
val=`echo $output | awk '{print $13}'`
if [ "$val" == "$process" ]; then
num=`echo "$output" | grep -oP "[S|R]\s+[0-9]*[.]?[0-9]" | awk '{print $2}'`
date +"%Y%m%d_%H%M%S" >> $filename
echo "$process: $num%" >> $filename
else
date +"%Y%m%d_%H%M%S" >> $filename
echo "$process: notfound" >> $filename
fi
done
&
am Ende des Befehls aus$ . toploop.sh chrome&
[1] 11175
$ tail -f log/top.log.chrome.20200526_011531
20200526_011602
chrome: notfound
20200526_011608
chrome: 6.2%
kill $ {bash PID}
auszuführen.