podemos esperar automaticamente o tempo necessário para smartmontools / smartctl?

1
Can we do something like this in a script (preferably zsh):

smartctl -t long /dev/sda
smartctl -t long /dev/sdb
smartctl -t long /dev/sdc

[Wait however long smartctl needs]

smartctl -H /dev/sda
smartctl -H /dev/sdb
smartctl -H /dev/sdc

Como é óbvio, estou apenas tentando automatizar isso.

    
por Ray Andrews 08.08.2017 / 02:37

2 respostas

3

Existem 2 possibilidades. smartctl -c listará as capacidades do dispositivo, que inclui linhas como

Short self-test routine 
recommended polling time:      (   1) minutes.
Extended self-test routine
recommended polling time:      (  48) minutes.

Assim, você pode simplesmente ler e dormir por um curto ou longo período de tempo.

Em segundo lugar, enquanto um teste está em andamento, a mesma opção -c listará o status atual de qualquer teste, por exemplo:

Offline data collection status:  (0x03) Offline data collection activity
  is in progress.
Self-test execution status:      ( 247) Self-test routine in progress...
  70% of test remaining.
Total time to complete Offline 
data collection:    (   44) seconds.

Assim, você pode pesquisar com intervalos de alguns minutos e esperar que o tempo restante retorne para 0 e os outros campos tenham seus valores finais:

Offline data collection status:  (0x02) Offline data collection activity
  was completed without error.
Self-test execution status:      (   0) The previous self-test routine completed
  without error or no self-test has ever 
  been run.
Total time to complete Offline 
data collection:    (    0) seconds.
    
por 08.08.2017 / 14:38
2

Não é bonito, mas parece que isso funciona. Poderia ser facilmente modificado para lidar com um número arbitrário de discos. Mods bem-vindos.

#!/usr/bin/zsh
#set -x

outputmsg () { echo -e "\e[35;1m$@\e[0m"; }
infomsg ()   { echo -e "\e[36;1m$@\e[0m"; }

smartctl -X /dev/sda &> /dev/null
wait_time_greatest=$( smartctl -t short /dev/sda | grep 'Please wait' | sed 's,^\(Please wait \)\([[:digit:]]*\)\(.*\),,' )

smartctl -X /dev/sdb &> /dev/null
wait_time_new=$( smartctl -t short /dev/sdb | grep 'Please wait' | sed 's,^\(Please wait \)\([[:digit:]]*\)\(.*\),,' )

[ "$wait_time_new" -gt "$wait_time_greatest" ] && wait_time_greatest="$wait_time_new"

wait_time_greatest=$((wait_time_greatest + 1)) #To be safe?

infomsg "\nWe'll be done in $wait_time_greatest minutes ...\n"
sleep "$[wait_time_greatest]m"

outputmsg "Disk sda:"   # Strange that the report doesn't contain the disk ID.
echo -e \e[0m       # Must reset the color!
smartctl -H /dev/sda

outputmsg "Disk sdb:"
echo -e \e[0m       # Must reset the color!
smartctl -H /dev/sdb

# Because smartctl seems to screw this up and it needs to be redone:
hdparm -S60y /dev/sda
hdparm -S60y /dev/sdb
    
por 08.08.2017 / 22:17