Thread Automatisches auslesen von Systemdaten,von denen nur bestimmte Zeilen in einer Textdatei ausgeben werden
(46 answers)
Opened by guest at 2011-10-11 10:02
Gestern hast Du geschrieben, dass $VAR = {} leer sei, jetzt ist es das doch nicht. Wie soll man da noch was verstehen?
Was funktioniert denn jetzt und was nicht? Die Definition der Subroutine get_part_info() enthält Syntax-Fehler (falsche Klammerung). Wie es da zu keiner Fehlermeldung kommen kann, versteh ich nicht. Außerdem beachtet sie nicht den Aufbau der Datei /proc/partitions; jedenfalls, soweit ich das auf meinem System nachvollziehen kann. grep() soll alle Zeilen ermitteln, die mit "#blocks" oder "name" beginnen. Da gibt es genau 0 (Null). Damit bleibt der Array @relevant_lines leer und es wird auch dementsprechend nichts im Daten-Hash eingetragen. Meine /proc/partitions schaut (gekürzt) so aus: Code: (dl
)
1 $ cat /proc/partitions Da gibt es keine Zeilen, die mit "#blocks" oder "name" anfangen... Ich habe mir mal die Mühe gemacht und Jejerods Skript und Deinen Schnipsel zusammengestellt, etwas umformatiert und leicht angepasst und die get_part_info() überarbeitet. Das folgende Skript funktioniert bei mir. Alle Informationen werden mir auf der Konsole direkt ausgegeben und auch in der Textdatei finde ich die Daten so wieder. Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 #!/usr/bin/perl use strict; use warnings; use Data::Dumper; $Data::Dumper::Sortkeys = 1; # Definition Sub Routinen ##################################################################### sub get_cpu_info { my ($refSi) = @_; my $infile = '/proc/cpuinfo'; open my $fh, '<', $infile or die "open(r, $infile) failed: $!\n"; my @relevant_lines = grep( /(^processor|^cpu MHz)/, <$fh> ); close $fh; my $current_cpu; foreach my $info (@relevant_lines) { if ($info =~ /processor\s*:\s*(\d+)/) { $current_cpu = $1; } elsif ($info =~ /cpu MHz\s*:\s+(\S+)/) { $refSi->{'Central Processing Units'}->{$current_cpu} = $1; } } } sub get_mem_info { my ($refSi) = @_; my $infile = '/proc/meminfo'; open my $fh, '<', $infile or die "open(r, $infile) failed: $!\n"; my @relevant_lines = grep( /(^MemTotal|^MemFree|^Buffers|^Cached)/, <$fh> ); close $fh; foreach my $info (@relevant_lines) { if ( $info =~ /^(\w+):\s+(\d+)\s+(\w+)$/) { my $name = $1; my $amount = $2; my $unit = $3; $refSi->{'Memory Information'}->{$name} = "$amount $unit"; } } } sub get_part_info { my ($refSi) = @_; my $infile = '/proc/partitions'; open my $fh, '<', $infile or die "open(r, $infile) failed: $!\n"; my $regex = qr/(\d+)\s+(\d+)\s+(\d+)\s+(\w+)/; while ( my $line = <$fh> ) { if ( my ($major, $minor, $block, $name ) = $line =~ $regex ) { $refSi->{'Partition Info'}->{$name} = $block; } } close $fh; } # Hauptprogramm ##################################################################### my %SysInfo; my $output_file = './sysinfo.txt'; get_cpu_info(\%SysInfo); get_mem_info(\%SysInfo); get_part_info(\%SysInfo); # Debug print Dumper(\%SysInfo); open my $out_fh, '>', $output_file or die "open(w, $output_file) failed: $!\n"; foreach my $section (sort keys %SysInfo) { printf $out_fh "=== %s ===\n", $section; foreach my $name ( sort keys %{ $SysInfo{$section} } ) { printf $out_fh "%s\t==>\t%s\n", $name, $SysInfo{$section}->{$name}; } } close $out_fh; exit 0; Last edited: 2011-10-26 10:57:42 +0200 (CEST) meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen! |