Portál AbcLinuxu, 5. listopadu 2025 00:12
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 subprocess
Nevíš čí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;
done
Dě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.