Hallo, Am Mit, 25 Jul 2007, gooly@gmx.at schrieb: [..]
Es gibt aber auch ein Debugging (siehe laptop_mode): anschalten: Konsole oder bash: echo 1 > /proc/sys/vm/block_dump Perl: system('echo 1 > /proc/sys/vm/block_dump');# switch on rw log
Besser: sysctl -w vm.block_dump=1 Bzw. gleich in der /etc/sysctl.conf eintragen. Mit perl besser: ==== open(PROC, ">/proc/sys/vm/block_dump") or die "$!\n"; print PROC 1; close(PROC) or die "$!\n"; ==== system sollte man eher vermeiden und wenn doch sollte man den Rückgabewert auswerten!
auslesen: Konsole Bash: dmesg |grep READ >/tmp/hd.log 2>&1 dmesg |grep WRITE >/tmp/hd.log 2>&1
Damit überschreibt letzteres aber ersteres.
Perl: system ( "dmesg |grep READ >$f 2>&1");
*urgsl* ==== open(DMESG, "dmesg |") or die "$!\n"; print grep( /READ|WRITE/, <DMESG>); close(DMESG) or die "$!\n"; ====
und hier mein kl. script um den Ausdruck zu konzentrieren #!/usr/bin/perl use strict; use warnings; # Einlesen in einen Perl Hash und ausdrucken, # Mehrfach Nennungen fallen so weg :) my %show; my $f = '/tmp/hd.log'; system ( "dmesg |grep READ > $f 2>&1"); if ( -s $f > 10 ) {
Wieso 10 Byte?
open F, "< $f" or warn "Can't open READ_File:$f< :$!\n";
Du liest aber trotzdem? *waaah*
foreach (<F>) { $show{READ}{"$1_$3"} = "$2 $3\t$1\n" if (/^(.+?): (.+?)(hda[23])[\n\r]*/) } close(F); } system ( "dmesg |grep WRITE > $f 2>&1"); if ( -s $f > 10 ) { open F, "< $f" or warn "Can't open WRITE_File:$f< :$!\n"; foreach (<F>) { $show{WRITE}{"$1_$3"} = "$2 $3\t$1\n" if (/(.+?):(. +?)(hda[23])[\n\r]*/) } close(F); } my $prt; exit 0 unless (exists $show{READ} || exists $show{WRITE} ); foreach (sort keys %{$show{READ}}) { $prt .= 'hd: '.$show{READ}{$_} } foreach (sort keys %{$show{WRITE}}) { $prt .= 'hd: '.$show{WRITE}{$_} } if ($prt) { open F, "> $f" or warn "Can't open hd-log:$f:$!\n"; print F $prt; close(F); } exit 0;
*urgsl* Ich block da nicht durch, v.a. was du da eigentlich machen willst, daher nur "in grob". ==== open(DMESG, "dmesg |") or die "$!\n"; while(<DMESG>) { next unless /READ|WRITE/; if (/(.+?):(.+?)(hda[23])[\n\r]*/) { print "hd: $2 $3\t$1\n"; } } close(DMESG) or die "$!\n"; ====
ein hadparm -S1 /dev/hda schickt die platte noch nicht mal in den schlaf naja, da muss wohl ein Blank dazwischen, ich vermute -S1 ist keine Option, -S 1 dann schon.
Nö. ==== # hdparm -S1 /dev/hdc /dev/hdc: setting standby to 1 (5 seconds) ====
dann erhalte ich die folgende Fehlermeldung: ./test.pl: line 1: my: command not found ./test.pl: line 2: syntax error near unexpected token `$state' ./test.pl: line 2: ` if (hd_is($state)) { print "$state\n"} else {print "NOT $state\n"}'
Ist etwa perl nicht installiert ? Perl Programm haben eine ziemlich wichtige erste Zeile: #!/usr/bin/perl
Nö. Die ist nur zu automatisch ausführen nötig. Ein perl ./test.pl wird immer gehen. Wenn die Zeile fehlt, dann wird das Script durch die shell ausgeführt und das gibt dann obige Fehler. -dnh -- Censorship sucks^W is for your own good. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org