Portál AbcLinuxu, 26. dubna 2024 16:19


Dotaz: BASH script - smartctl, csv, expr, awk

9.7.2007 10:07 D3d
BASH script - smartctl, csv, expr, awk
Přečteno: 2952×
Odpovědět | Admin
Dobrý den, Rád bych Vás požádal o pomoc s dotvořením scriptu pro testování smartctl. Script provádí výpis smartctl do csv souboru. Pomocí awk exportuji jen hodnoty na řádku 10 (RAW_Value). Teď bych potřeboval dotvořit pomocí for,expr atd. že když ID (první řádek) je 1 tak aby vypsal hodnoty do csv souboru, když 2 není tak aby vepsal do csv souboru středník ";" atd do hodnoty 255. Zkontrolovat tedy jaký je ID číslo a podle toho se zachovat. Takhle vypadá výpis smartu:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   057   049   006    Pre-fail  Always       -       140496120
  3 Spin_Up_Time            0x0003   099   096   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       189
  5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   063   060   030    Pre-fail  Always       -       519947024875
  9 Power_On_Hours          0x0032   073   073   000    Old_age   Always       -       24065
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       320
194 Temperature_Celsius     0x0022   043   051   000    Old_age   Always       -       43
195 Hardware_ECC_Recovered  0x001a   057   049   000    Old_age   Always       -       140496120
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   194   000    Old_age   Always       -       10
200 Multi_Zone_Error_Rate   0x0000   100   253   000    Old_age   Offline      -       0
202 TA_Increase_Count       0x0032   100   253   000    Old_age   Always       -       0
Kus scriptu:
for diskk in a b;
 do
  for b in `/usr/sbin/smartctl -A /dev/hd${diskk} | grep '^[ 0-9][ 0-9][0-9]' | awk '{print $10 ";"}'`;
   do echo -n $b  >> hdd_smart.csv ;
     done;
    done;
Nejsem v BASHi tak zběhlej a proto netuším co by bylo nejlepší a nejednoduší k použití. Díky moc za každou pomoc nebo nasměrování.
Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

andree avatar 9.7.2007 11:50 andree | skóre: 39 | blog: andreeeeelog
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Odpovědět | | Sbalit | Link | Blokovat | Admin
nieco ako

...

for x in `/usr/sbin/smartctl -A /dev/hd${diskk} | grep -v ID# | sed "s%^[ ]*\([0-9]*\).*%\1%"`; do echo -n $x\; ; done

?
9.7.2007 12:19 D3d
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Nepotřebuji grepovat daný ID smart hodnoty, potřebuji kontrolu jestli je na ID řádku 1 uvedena hodnota smart, když ano vložit hodnotu (RAW_Value) když není tak vložit ";" pro odsazení v csv souboru (";" dělá prázdnou buňku v csv).

V příkladu budu mít jen: ID 1 a ID 202 - tak vložím do buňky číslo 1 hodnotu a do buňky číslo 202 vložím hodnotu - do buněk 2 až 201 vložím středník a do buněk 203 až 255 zase vložím středník. Tohoto potřebuji docílit, ale bohužel netuším jak.
9.7.2007 12:05 mlz | skóre: 12 | blog: Obcas
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Odpovědět | | Sbalit | Link | Blokovat | Admin
Snad jsem pochopil
for i in a b; do smartctl -A "/dev/hd$i" | awk '
$1>=1 && $1 <=255 {a[$1]=$10}
END {
for(i=1;i<=255;i++)
{
if(a[i])
{printf "%d", a[i]}
printf ";"
}
}';
echo;
done
9.7.2007 12:21 D3d
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Jo to by mělo být ono, děkuji mockrát za pomoc.
9.7.2007 12:51 D3d
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Tak předčasná radost,

Tento script sice udělá skoro vše co potřebuji, ale je tam chyba s kterou si nevím rady

Výpis scriptu:
143198173;;;189;;;519947058931;;24068;;;320;;
Jak vidíte tak hodnota (0) s ID číslem 3 v buňce není vůbec. Mělo by to vypadat:
143198173;0;189;;;519947058931;;24068;0;320;;
Nevíte jak doplnit script aby vypisoval i tu nulu do buňky? Díky moc za pomoc.
9.7.2007 13:46 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Odpovědět | | Sbalit | Link | Blokovat | Admin
Takhle?
#!/usr/bin/python
import subprocess

values = ['' for i in range(256)]
process = subprocess.Popen(['smartctl', '-A', '/dev/sda'],
                          stdout = subprocess.PIPE)
for line in process.stdout:
    splitted = line.split()
    try:
        id = int(splitted[0])
        raw_value = int(splitted[9])
    except ValueError:
        continue
    except IndexError:
        continue
    values[id - 1] = '%d' %raw_value

print ';'.join(values)
Udělá to spoustu čísel a středníků, např.
24771859;;0;74;0;;685596218;;13667;0;;122;;;;;; atd.
Je to tak správně?
9.7.2007 13:52 D3d
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Jo to je naprosto správně, jen je škoda že je to v Pythonu.

Jelikož tohle je jen část scriptu a celkový script je komplet napsaný v BASHi - nemám na to abych to přepisoval do nového jazyku, už takhle mám problémy :) Ale přesně takhle by to mělo vypadat.
9.7.2007 14:02 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
A mohl bys jen tak pro zajímavost napsat, co ten celkový skript dělá? Na přepsání něčeho z shellu do Pythonu nikdy není pozdě. Obzvlášť, je-li to program na více než pět řádků, což je asi tak hranice rozumné použitelnosti shellu.
9.7.2007 14:39 D3d
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Celý script testuje HDD pomocí S.M.A.R.T a vypisuje v daném intervalu hodnoty. Script má 87 řádek a nevím jestli jsem ještě u konce. Zatím zapisuje teploty HDD do teploty.csv (čas,disk,teplota). Dále vypisuje celkový S.M.A.R.T do souboru hdd_číslo_čas.txt a pak RAW_Value hodnoty do raw.csv (cas,s/n: disku,hodnoty RAW) Tenhle raw.csv se pak bude přenášet do MySQL databáze pro další využití. Proto potřebuji mít daný hodnoty podle ID v dané buňce csv souboru (bohužel se musí zachovat i ten raw.csv, jinak bych to rovnou dával do MySQL). Jelikož každý disk má S.M.A.R.T trochu jinak (podle toho jak se výrobce disku zrovna probudí) tak musím zachovat ID i v buňkách csv souboru.

Byl bych rád kdyby mi někdo pomohl s tím scriptem od MLZ je dostačující, jen mi bohužel nezapisuje ty nuly do buněk.
9.7.2007 15:27 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Vím, že to nepoužiješ, ale pro inspiraci - mohlo by to vypadat třeba takhle.
#!/usr/bin/python
import subprocess, time

class Smart:
    def __init__(self, diskk):
        self.diskk = diskk
        values = ['' for i in range(256)]
        process = subprocess.Popen(['smartctl', '-a', '/dev/' + diskk],
                                  stdout = subprocess.PIPE)
        self.alllines = []
        for line in process.stdout:
            self.alllines.append(line)
            splitted = line.split()
            if 'Serial Number:' in line:
                self.sn = splitted[-1]
            try:
                id = int(splitted[0])
                raw_value = int(splitted[9])
            except ValueError:
                continue
            except IndexError:
                continue
            values[id - 1] = '%d' %raw_value
            if splitted[1] == 'Temperature_Celsius':
                self.temperature = raw_value
        self.rawvalues = ';'.join(values)
        self.now_int = int(time.time())

    def pis_teplotu(self):
        cas_disk_teplota = '%d, %s, %d\n' %(self.now_int,
                                            self.diskk,
                                            self.temperature)
        print cas_disk_teplota
        file('teploty.csv', 'a').write(cas_disk_teplota)

    def pis_celk_smart(self):
        filename = '%s_%s_%d.txt' %(self.diskk, self.sn, self.now_int)
        print filename
        file(filename, 'w').writelines(self.alllines)

    def pis_raw_values(self):
        line = '%d,%s,%s\n' %(self.now_int, self.sn, self.rawvalues)
        print line
        file('raw.csv', 'a').write(line)

while True:
    disk = Smart('sda')
    disk.pis_teplotu()
    disk.pis_celk_smart()
    disk.pis_raw_values()
    time.sleep(10)
Ten interval jsem plácl deset sekund. Klidně to zahoď, ale dělá to aspoň zhruba to co má?
10.7.2007 09:12 D3d
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Při puštění scriptu mi vyhlásí chybu

Traceback (most recent call last):
  File "test", line 2, in ?
    import subprocess, time
ImportError: No module named subprocess
Nevíš čím to může být ? Jak říkám Python neumím vůbec.
10.7.2007 10:11 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
No, vypadá to, jako by chyběl modul subprocess, což by mohlo být způsobeno příliš starou verzí Pythonu. Jenže asi to bude něco jiného, protože ten předchozí příklad ti fungoval a přitom subprocess používá taky.
Nezkoušíš to třeba na jiném počítači? Kdyby ses tím chtěl zabývat, napiš mi na jabber a semka potom napíšem nějaký závěr.
10.7.2007 12:09 D3d
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Máš pravdu. Testoval jsem to na jiné mašině :) na který je stará verze Pythonu. Mám tu už trochu zmatek.
10.7.2007 10:28 R
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Naco z toho vyrabas CSV, ked to mozes dat rovno do MySQL? man mysql
10.7.2007 13:08 D3d
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Jak jsem psal - musí být zachován i csv soubor. Jinak bych to samo dával rovnou do MySQL. Po dokončení a redukci zdrojáku je celkový script na 50 řádků (i s mezerami)

Kus finálního scriptu:

# RAW VALUE 
for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23;
 do
  for raw in `/usr/sbin/smartctl -A -d 3ware,${i} | 
  awk ' BEGIN { for(i=1;i<254;i++) a[i]=-1 } $1>=1 && $1<=253 { a[$1]=$10 } 
  END { for(i=1;i<254;i++) { if(a[i]>=0) printf "%d", a[i]; printf ";" } }'`;
   do
    for sn in `/usr/sbin/smartctl -a -d 3ware,${i} | grep "Serial Number" | awk '{print $3}' `;
     do echo -n $cas ";" >> testy/hdd_smart.csv | 
        echo -n $sn ";" >> testy/hdd_smart.csv; echo -n $raw >> testy/hdd_smart.csv;
        echo "" >> testy/hdd_smart.csv;
  done;
 done;
done
Děkuji všem za pomoc při vytváření tohoto kusu scriptu.
11.7.2007 11:14 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
for raw in `cokoli`
Je velmi velmi velmi špatný nápad!
# RAW VALUE 
for((i=0; i<24; i++))
do
  raw="$(/usr/sbin/smartctl -A -d 3ware,${i} | 
      awk 'BEGIN { for(i=1;i<254;i++) a[i]=-1 }
        $1>=1 && $1<=253 { a[$1]=$10 }
        END { for(i=1;i<254;i++)
          { if(a[i]>=0) printf "%d", a[i]; print ";" }
        }')"
  sn="$(/usr/sbin/smartctl -a -d 3ware,${i} |
    awk '/Serial Number/ {print $3}')"
  echo "$cas;$sn;$raw" >> testy/hdd_smart.csv
done
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
11.7.2007 22:06 makarenko
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
for raw in `cokoli`
Je velmi velmi velmi špatný nápad!
Smím vědět proč? Platí to pro tenhle konkrétní případ nebo všeobecně (čemuž se mi nechce věřit)? Kuji.
11.7.2007 22:18 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Platí to naprosto obecně. Důvodem je, že se ten výstup parsuje bashem a mohou velmi lehce vzniknout podivné výsledky. Těžko najít nějaký příklad, kdy by taková konstrukce byla vhodná.
for i in `ls *.txt`
je naprosto nevhodné, protože to může zhavarovat na velikost ve starších verzích shellu, nebo nějakém minimalistickém, např busybox. A pak to pěkně rozbije jen hloupá mezera v názvu souboru nebo adresáře. Přitom to jde krásně napsat
for i in *.txt
Sekvence
for i in `seq 1 2 10`
jde jednoduše nahradit
for((i=1;i<=10;i+=2))
A všechny ty
for i in `cokoli`
jde nahradit bezpečnějším
cokoli | while read i
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
12.7.2007 01:02 makarenko
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Uhm, přiznávám, přehlédl jsem ty backquotes okolo cokoli.
Beru tu poznámku o délce (viz „zhavarovat na velikost“), ale těm problémům s mezerami se přeci dá v uvedeném případě předejít:
( IFS=$'\n'; for i in $(ls *.txt); … )
V žádném případě netvrdím, že je to lepší varianta než
 in *.txt 
ale s tím si zase nevystačím ve složitějších selekcích a v situaci, kdy nepůjde o cyklus přes soubory/adresáře.
12.7.2007 07:33 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
... ale s tím si zase nevystačím ve složitějších selekcích a v situaci, kdy nepůjde o cyklus přes soubory/adresáře.
Na složitější selekce máme find + xargs a nebo while read
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
17.7.2007 10:27 D3d
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Dobrý den,

Mohu Vás ještě požádat o pomoc? Rád bych, aby se ten script opakoval každých 5min a nechci to dávat do cronu, jak toho docílím pomocí BASHe ?
17.7.2007 10:38 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Takový "dodatečný" dotaz bys měl pokládat v novém vlákně. Podobná věc se řešila třeba tady
http://www.abclinuxu.cz/forum/show/185745
Upozorňuji, že když použiješ úplně nejjednodušší řešení (while true....sleep), tak časy v logu budou vypadat dost hnusně.
Kdybys to chtěl spouštět pravidelně a přesně každých pět minut, máš tuto možnost:
http://www.abclinuxu.cz/forum/show/185745#14
Josef Kufner avatar 17.7.2007 10:46 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
A máš nějaký závažný důvod, proč to nedávat do cronu?
Hello world ! Segmentation fault (core dumped)
9.7.2007 16:12 Tomáš | skóre: 31 | blog: Tomik
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Zalezi na tom, co ten skript dela. Mam i skripty na 100 radku, delaji hodne jednoduchych akci (treba kopirovani a konverze obrazku), takze Python by zlepseni neprinesl.
9.7.2007 14:38 ams
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Upravena verze skriptu:
for i in a b; do 
smartctl -A "/dev/hd$i" | awk '
BEGIN { for(i=1;i<256;i++) a[i]=-1 } 
$1>=1 && $1<=255 { a[$1]=$10 }
END { for(i=1;i<256;i++) { if(a[i]>=0) printf "%d", a[i]; printf ";" } }'
echo
done
9.7.2007 14:53 D3d
Rozbalit Rozbalit vše Re: BASH script - smartctl, csv, expr, awk
Díky moc, to je přesně ono - to jsem potřeboval.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.