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

Linuxer
 2011-10-25 20:05
#153554 #153554
User since
2006-01-27
3888 articles
HausmeisterIn

user image
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
2
3
4
5
6
$ cat /proc/partitions 
major minor #blocks name

8 0 156289847 sda
8 1 1502046 sda1
8 2 60002775 sda2

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.

more (20.7kb):

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!

View full thread Automatisches auslesen von Systemdaten,von denen nur bestimmte Zeilen in einer Textdatei ausgeben werden