Daten aus /proc/meminfo in Array und einzeln auslesen, wie?

Begonnen von franky08, 23 Mai 2016, 19:42:57

Vorheriges Thema - Nächstes Thema

franky08

Ich stehe vor folgenden Problem und bekomme es leider nicht gelöst. Wenn ich mit:

my @daten4 = {system("cat /proc/meminfo")}

folgende Daten in das array @daten4 schreiben möchte:
MemTotal:        8064160 kB
MemFree:         5065108 kB
MemAvailable:    7799528 kB
Buffers:          175748 kB
Cached:          2514244 kB
SwapCached:            0 kB
Active:           678760 kB
Inactive:        2149852 kB
Active(anon):     139516 kB
Inactive(anon):     8496 kB
Active(file):     539244 kB
Inactive(file):  2141356 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       8278012 kB
SwapFree:        8278012 kB
Dirty:                88 kB
Writeback:             0 kB
AnonPages:        138624 kB
Mapped:            45708 kB
Shmem:              9388 kB
Slab:             115560 kB
SReclaimable:      96096 kB
SUnreclaim:        19464 kB
KernelStack:        2560 kB
PageTables:         4772 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    12310092 kB
Committed_AS:     426140 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:    104448 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       93704 kB
DirectMap2M:     8183808 kB


aus dem array möchte ich dann mittels:
my $mem1 = $daten4[1]; # MemTotal
my $mem2 = $daten4[4]; # MemFree
my $mem3 = $daten4[7]; # MemAvailable
my $mem4 = $daten4[14]; #Cached
my $mem5 = $daten4[47]; #SwapFree


den Variablen $mem1 bis $mem5 die einzelnen Werte aus dem Array zuweisen, leider funktioniert das so nicht, da es ja eine Art Tabelle mit Zeilenumbrüchen ist. Mit folgendem Schnipsel probiert:
my ($daten4) = @_;
 
my $memg = {system("cat /proc/meminfo")};
my @daten4 = split(/ /,$memg); # und der Zeilenumbruch ???

my $mem1 = $daten4[1]; # MemTotal
my $mem2 = $daten4[4]; # MemFree
my $mem3 = $daten4[7]; # MemAvailable
my $mem4 = $daten4[14]; #Cached
my $mem5 = $daten4[47]; #SwapFree

fhem "setreading Memory MemTotal $mem1";
fhem "setreading Memory MemFree $mem2";
fhem "setreading Memory MemAvailable $mem3";
fhem "setreading Memory Cached $mem4";
fhem "setreading Memory SwapFree $mem5";


Kann mir jemand einen Tipp geben?

VG
Frank
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

betateilchen

#1

sub test {
  my @daten4 = split(/\n/,qx(cat /proc/meminfo));
  return Dumper @daten4;
}


kannst Du in Deine 99_myUtils.pm packen und dann mit {test} im fhem Frontend testen.

Ich würde das Ergebnis danach in einen hash %meminfo speichern und dabei die Parameternamen als key verwenden, dann kannst Du mit $meminfo->{MemTotal} direkt auf den Wert zugreifen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

franky08

Klasse, die regex in split war es was mir dringend gefehlt hat.

VG
Frank
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

betateilchen

Korrigierte Fassung:


sub test {
  my %meminfo;
  my @daten4 = split(/\n/,qx(cat /proc/meminfo));
  foreach (@daten4) {
    my ($key,$rest) = split(/:/,$_);
$rest =~ s/ //g;
$rest =~ s/kb$//i;
$meminfo{$key} = $rest;
  }
  return Dumper \%meminfo;
}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

franky08

Melde mich noch einmal, was ich nicht verstehe ist, wie ich die Daten aus
$meminfo->{MemTotal}

einer neuen Variable zuweisen oder zurück in ein device schreiben kann.

mit $mem1 = $meminfo->{MemTotal}; geht das nicht, was übersehe ich dabei?
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

betateilchen

Lass mal das -> weg.

Aber irgendwie denkst Du viel zu kompliziert, denn


$meminfo{MemTotal}
$meminfo{MemFree}

usw.


sind doch bereits Deine Variablen, auf die Du direkt zugreifen kannst, ohne sie vorher noch einmal irgendwohin zuweisen zu müssen. Diese Namen sind doch viel einfacher zu verstehen, als wenn man sie einfach nur durchnummeriert.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

franky08

Ok, so komme ich weiter, vielen Dank betateilchen.

VG
Frank
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

betateilchen

Noch einen Schritt weiter? Gerne  8)

Du kannst direkt in der foreach Schleife die readings in Deinem device befüllen.
Problematisch dabei sind allerdings die Werte mit den Klammern, diese Klammern muss man vorher noch wegregexen.


sub test {
#  my %meminfo;
  my @daten4 = split(/\n/,qx(cat /proc/meminfo));
  foreach (@daten4) {
    my ($key,$rest) = split(/:/,$_);
    $key  =~ s/[\(\)]//g;
    $rest =~ s/ //g;
    $rest =~ s/kb$//i;
# $meminfo{$key} = $rest;
    CommandSetReading(undef,"Memory $key $rest");
  }
}


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