Portál AbcLinuxu, 10. května 2025 04:18
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 - 0Kus 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í.
...
for x in `/usr/sbin/smartctl -A /dev/hd${diskk} | grep -v ID# | sed "s%^[ ]*\([0-9]*\).*%\1%"`; do echo -n $x\; ; done
?
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
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.
#!/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ě?
#!/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á?
Traceback (most recent call last): File "test", line 2, in ? import subprocess, time ImportError: No module named subprocessNevíš čím to může být ? Jak říkám Python neumím vůbec.
# 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; doneDěkuji všem za pomoc při vytváření tohoto kusu scriptu.
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
Smím vědět proč? Platí to pro tenhle konkrétní případ nebo všeobecně (čemuž se mi nechce věřit)? Kuji.for raw in `cokoli`
Je velmi velmi velmi špatný nápad!
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 *.txtSekvence
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
( IFS=$'\n'; for i in $(ls *.txt); … )V žádném případě netvrdím, že je to lepší varianta než
in *.txtale 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.
... 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
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
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.