einfaches Notify zum Auslesen des Systemstatus (Linux)

Begonnen von NE555, 16 April 2023, 20:10:26

Vorheriges Thema - Nächstes Thema

NE555

VMSTAT  unter qx (Ausführen von Systembefehlen) aufrufen, zur Verwendung im Notify, erhaltene Werte werden in der Logdatei und als UserReadings ( zur weiteren Verwendung, z.B. im GplotFile ) ausgegeben, ausführlich dokumentiert.
vmstat_Start:on
{
my $sFSA = 3;  # FehlerSuchAusgabe 0-keine Ausgabe, 1-kurze Ausgabe, 2-ausführliche Ausgabe+1, 3-spezielle Ausgabe+2+1,
# Ausgabe in der Logsatei
if ( $sFSA >= 3 ) {Log 1, "++++++++++ $SELF ++++++++++ wurde durch $NAME ausgeloest, Event:$EVENT spezielle Ausgabe+2+1"}
if ( $sFSA >= 2 ) {Log 1, "++++++++++ $SELF ++++++++++ wurde durch $NAME ausgeloest, Event:$EVENT ausführliche Ausgabe+1"}
if ( $sFSA >= 1 ) {Log 1, "++++++++++ $SELF ++++++++++ wurde durch $NAME ausgeloest, Event:$EVENT kurze Ausgabe"}

###########################################################################################################
#
#  VMSTAT  unter qx (Ausführen von Systembefehlen) aufrufen,
#
#  zur Verwendung im Notify,
#
#  erhaltene Werte werden in der Logdatei
#
#  und als UserReadings ( zur weiteren Verwendung, z.B. im GplotFile ) ausgegeben
#
#  ausführlich dokumentiert
#
###########################################################################################################

=begin
###Kommentar

Die Werte haben dabei folgende Bedeutung:
• procs
• r: Anzahl der auf Prozessor-Zeit wartenden Prozesse
• b: Anzahl der nicht wiederbelebbaren schlafenden Prozesse

• memory
• swpd: Größe des genutzten virtuellen Speichers
• free: Größe des ungenutzten Speichers
• buff: Größe des als Festplatten-Puffer genutzten Teils des Speichers
• cache: Größe des als Cache genutzten Speichers

• swap
• si: (swap-in) Menge des Speichers, der von der Festplatte eingelesen wird
• so: (swap-out) Menge des Speichers, der auf die Festplatte ausgelagert wird

• io
• bi: (block-in) eingehende Blöcke pro Sekunde von Blockmedien (z.B. Festplatte)
• bo: (block-out) ausgehende Blöcke pro Sekunde an Blockmedien (z.B. Festplatte)

• System
• in: (interrupts) Anzahl der Interrupts pro Sekunde (inkl. der internen Uhr)
• cs: (context switches) Anzahl der Kontextwechsel pro Sekunde

• CPU (alle Werte in Prozent der gesamten CPU-Zeit)
• us: (user) Zeit, die für User-Prozesse verbraucht wird
• sy: (system) Zeit, die für Kernelprozesse verbrauchte Zeit
• id: (idle) Leerlaufzeit
• wa: (wait) Wartezeit der CPU auf I/O-Operationen (z.B. Festplatte, Netzwerk)
• st: (nur bei aktiven virtuellen Maschinen auf dem Hostsystem) CPU-Zeit für VMs

vmstat ohne Optionen
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu-------
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 1935764 0 0 0 0 14 1 0 1 0 1 98 0

###Kommentar
=end
=cut

my $doc = qx{vmstat};                                    # Systembefehl vmstat in einen Skalar
if ( $sFSA >= 1 ) {Log 1, "++++++++++ $SELF ++++++++++ wurde durch $NAME ausgeloest, Event:$EVENT doc:$doc"}  # kurze Ausgabe

# Variablendefinition
my $Zeile1 = '';                                         # procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu-------
my $Zeile2 = '';                                         # r b swpd free buff cache si so bi bo in cs us sy id wa
my $Zeile3 = '';                                         # 0 0 0 1935764 0 0 0 0 14 1 0 1 0 1 98 0
my $Anzahl_Werte = 17;                                   # Anzahl der Werte
my $sstring = '';                                        # Suchstring
my $pos = '';                                            # Position

$sstring = "\n";                                         # Zeile bis zum CR übernehmen
$pos = index($doc,$sstring);                             # den String suchen - Stelle zurück, sonst -1
$Zeile1 = substr($doc,0,$pos);                           # bis zum gesuchten String kopieren
$doc = substr($doc,$pos+length($sstring));               # bis zum gesuchten String (einschließlich diesem) löschen
if ( $sFSA >= 2 ) {Log 1, "++++++++++ $SELF ++++++++++ wurde durch $NAME ausgeloest, Zeile1:$Zeile1"}

$pos = index($doc,$sstring);                             # den String suchen - Stelle zurück, sonst -1
$Zeile2 = substr($doc,0,$pos);                           # bis zum gesuchten String kopieren
$doc = substr($doc,$pos+length($sstring));               # bis zum gesuchten String (einschließlich diesem) löschen
if ( $sFSA >= 2 ) {Log 1, "++++++++++ $SELF ++++++++++ wurde durch $NAME ausgeloest, Zeile2:$Zeile2"}

$pos = index($doc,$sstring);                             # den String suchen - Stelle zurück, sonst -1
$Zeile3 = substr($doc,0,$pos);                           # bis zum gesuchten String kopieren
$doc = substr($doc,$pos+length($sstring));               # bis zum gesuchten String (einschließlich diesem) löschen
if ( $sFSA >= 2 ) {Log 1, "++++++++++ $SELF ++++++++++ wurde durch $NAME ausgeloest, Zeile3:$Zeile3"}

$Zeile2 =~ s/^\s+//;                                     # Leerzeichen davor entfernen
$Zeile2 =~ s/\s+$//;                                     # Leerzeichen danach entfernen
$Zeile3 =~ s/^\s+//;                                     # Leerzeichen davor entfernen
$Zeile3 =~ s/\s+$//;                                     # Leerzeichen danach entfernen
$Zeile2 =~ s/ +/;/g;                                     # ein oder mehrere Leerzeichen im String zu einem ; Zeichen
$Zeile3 =~ s/ +/;/g;                                     # ein oder mehrere Leerzeichen im String zu einem ; Zeichen
if ( $sFSA >= 2 ) {Log 1, "++++++++++ $SELF ++++++++++ wurde durch $NAME ausgeloest, Zeile2:$Zeile2"}
if ( $sFSA >= 2 ) {Log 1, "++++++++++ $SELF ++++++++++ wurde durch $NAME ausgeloest, Zeile3:$Zeile3"}

my @Kopf = split(/;/,$Zeile2,$Anzahl_Werte);             # das Skalar, also eine einfache Variable in ein Array (; als Trennzeichen)
my @Werte= split(/;/,$Zeile3,$Anzahl_Werte);             # das Skalar, also eine einfache Variable in ein Array (; als Trennzeichen)

if ( $sFSA >= 2 )
{
my $Zeile2t = join("-",@Kopf);                                  # das Array in ein Skalar (- als Trennzeichen)
my $Zeile3t = join("-",@Werte);                                 # das Array in ein Skalar (- als Trennzeichen)
{Log 1, "++++++++++ $SELF ++++++++++ Zeile2t:$Zeile2t"}      # Test-Ausgabe
{Log 1, "++++++++++ $SELF ++++++++++ Zeile3t:$Zeile3t"}      # Test-Ausgabe
}

# Variablendefinition
my $myRName = '';                                        # UserReading
my $myRWert = '';                                        # der zum UserReading gehörige Wert
my $Zvar = '';                                           # Zählvariable, um die UserReadings zu ordnen
my $i = 0;                                               # Zählvariable für die while-Schleife

while($i < $Anzahl_Werte)                                # von 0 bis 16
{
$Zvar = sprintf("%02d",$i+1);                            # laufende Nummer mit führender Null bei einstelligen Zahlen
$myRName = $Zvar.$Kopf[$i];                              # 01 und erster Eintrag im Skalar
$myRWert = $Werte[$i];                                   # erster Eintrag im Skalar
if ( $sFSA >= 2 ) {Log 1, "++++++++++ $SELF ++++++++++ $myRName:$myRWert"}   # Testweise Ausgabe
fhem("setreading $SELF $myRName $myRWert");          # Ausgabe als UserReading
$i++;                                                    # Skalar wird inkrementiert
}

# auslösendes Dummy nach 1s wieder auf off
fhem "sleep 1; set vmstat_Start off";
}

und der Dummy zum Starten:
defmod vmstat_Start dummy
attr vmstat_Start room Entwicklung
attr vmstat_Start webCmd on:off
RPI3 SONOFF sV,Touch,S26 mit Tasmota

betateilchen

Abgesehen davon, dass der Thread-Titel

Zitateinfaches Notify zum Auslesen des Systemstatus (Linux)

eine ziemliche Katastrophe ist, weil niemand auch nur erahnen kann, worum es hier geht, sollte man ein solch umfangreiches Code-Konstrukt besser in eine Funktion der 99_myUtils.pm packen anstatt in das DEF eines notify.

Außerdem verstehe ich den Unterschied zwischen "vmstat_Start" und "vmstat_start" noch nicht, zumal ein device mit dem zweiten Namen (vmstat_start) nicht erwähnt wird, dort aber readings gelöscht werden.

Very strange.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

NE555

#2
Notify anlegen mit: defmod vmstat_start notify a b  sorry, hab ich nicht angegeben, habe nachgebessert.
Habe auch einige Kommentarzeile, welche bestimmt verwirren, entfernt.
Unterschied zwischen "vmstat_Start" und "vmstat_start :  vmstat_Start ist der Dummy (zum Aufruf des Notify vmstat_start) aber das ist ja ersichtlich -> defmod vmstat_Start dummy und diese Namen kann man ändern, wie man will.

und was passt dir am Titel nicht, der sagt doch grob den Zweck des Codeschnipsels?
und warum in eine Funktion der 99_myUtils.pm, was ist da anders?

Vielen Dank !
RPI3 SONOFF sV,Touch,S26 mit Tasmota

Prof. Dr. Peter Henning

ZitatUnterschied zwischen "vmstat_Start" und "vmstat_start :  vmstat_Start ist der Dummy
Wer so etwas einbaut, ist selber Schuld, wenn er das irgendwann einmal verwechselt. In eine Anleitung für Andere gehört so etwas auf keinen Fall hinein - wie man an der Nachfrage sieht.

Zitatund was passt dir am Titel nicht, der sagt doch grob den Zweck des Codeschnipsels?
Es ist keinesfalls so, dass das einer Person "nicht passt". Sondern dass dieser "Codeschnipsel" nur ein paar Zeilen Perl-Code zur Bearbeitung eines Datenstrings (der Ausgabe von vmstat) ist. Und mit "notify" nicht die Bohne zu tun hat. Der Titel ist also schlicht irreführend.

Zitatund warum in eine Funktion der 99_myUtils.pm, was ist da anders?
Langer Perl-Code gehört nicht in die Systemkonfiguration. Vlt. einfach mal die Anfänger-Doku lesen.

LG

pah

NE555

ok, vielen Dank für die Rückmeldungen.
RPI3 SONOFF sV,Touch,S26 mit Tasmota