Recuerda:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBePvy873hauQhYfGRIjomrfwwN7alBiv377MJ2XBjSQqc8ewdoxo4wANAWs7s9355sw5u_aGGCjPiSd8bhqPc_ETojFkBMu6X9aqv92RgrY-EVnbsOqulkGyU5_FGHXQa1sWIIUpBZfYqYFCdJHSKYwOq615pNmz-nk5c34a2H4YtodUh2g/s320/Frases_que_inspiran_Refranes_2019-08_22.jpg)
Recuerda:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBePvy873hauQhYfGRIjomrfwwN7alBiv377MJ2XBjSQqc8ewdoxo4wANAWs7s9355sw5u_aGGCjPiSd8bhqPc_ETojFkBMu6X9aqv92RgrY-EVnbsOqulkGyU5_FGHXQa1sWIIUpBZfYqYFCdJHSKYwOq615pNmz-nk5c34a2H4YtodUh2g/s320/Frases_que_inspiran_Refranes_2019-08_22.jpg)
0. Objetivo
El comando smartctl tiene un gran número de parámetros y muestra una gran cantidad de información. Este script ejecuta smartctl con los parámetros necesarios y muestra una información básica.
En la presente entrada se muestra todo el proceso de creación del script en bash, la utilización de funciones, condiciones, redirección y el uso de las instrucciones smartctl, grep y cut.
Advertencia: Este script se ha escrito con pocos conocimientos de bash y muchas consultas a google. Parece funcionar en Debian 10 Buster (v10.13 del 10 de septiembre de 2022)
1. El esqueleto de una función en bash
#!/bin/bash
hello_word() {
echo "hola"
}
hello_word
1.1 Funciones en bash
- La función no lleva consta de un nombre seguido de un paréntesis vacío y el código de la función entre llaves.
- Los parámetros de la función se acceden mediante $1, $2, etc.
- Las llamadas a la función no utilizan paréntesis.
- La función se llama simplemente con su nombre.
- Los parámetros se añaden a continuación del nombre, sin paréntesis
- Hay que tener cuidado con los espacios en la instrucción if
if [ $? == 0 ];
2. Detección de la presencia de los discos duros
Para detectar la presencia del disco duro se hace un ls al dispositivo y se examina el resultado devuelto en la variable de bash $?. Si el dispositivo existe se devolverá 0, de lo contrario, un valor distinto corresponde al código de error.
detect_hds() {
echo "Buscando sda"
ls /dev/sda &> /dev/null
echo $?
echo "Buscando sdb"
ls /dev/sdb &> /dev/null
echo $?
echo "Buscando sdc"
ls /dev/sdc &> /dev/null
echo $?
echo "Buscando sdd"
ls /dev/sdd &> /dev/null
echo $?
}
detect_hds
3. Añadiendo la instrucción if
if [ $? == 0 ];
then
echo "OK"
else
echo "No detectado"
fi
4. Simplificación de la función utilizando un parámetro
El tamaño de la función llamando a la función con un parámetro que contenga el dispositivo.
#!/bin/bash
La función no lleva los parámetros en la declaración. Internamente se llaman $1, $2, ...
detect_hd() {
ls "$1" &> /dev/null
if [ $? == 0 ];
then
echo "$1 OK"
else
echo "$1 No detectado"
fi
}
El parámetro va a continuación del nombre de la función, sin paréntesis.
detect_hd /dev/sda
detect_hd /dev/sdb
detect_hd /dev/sdc
detect_hd /dev/sdd
5. Comprobar la salud del disco duro con smartctl
La respuesta más sencilla de smartctl se obtiene con el parámetro -H. Obtener esta linea:
SMART overall-health self-assessment test result: PASSED
tranquilizará todos los espíritus inquietos.
if [ $? == 0 ];
then
#echo "$1 OK"
smartctl -H "$1" |grep health
else
echo "$1 No detectado"
fi
6. Obtener las horas de uso del disco duro
Como curiosidad, obtener el resultado del atributo Power_On_Hours.
6.1. GREP: obtención de la linea que contiene el atributo Power_On_Hours
Obtener de smartctl con -A <dispositivo> la lista de atributos y extraer con grep el que interesa. En este caso, el nombre del dispostivo /dev/sdx se sutituye por el primer parámetro de la función ($1).
LINE=`smartctl -A $1 | grep "Power_On_Hours"`
6.2 CUT: obtención del dato con el número de horas
Tenemos en $LINE una serie de palabras separadas por espacios (parámetro -d '<espacio>'). La que nos interesa obtener es la que ocupa la posición (parámetro -f10).
HOURS=`echo $LINE |cut -d ' ' -f10`
7. El resultado final
#!/bin/bash
detect_hd() {
ls "$1" &> /dev/null
if [ $? == 0 ];
then
#Obtención de datos
DEVICE=`smartctl -i "$1" | grep "Device Model"`
MODEL=`smartctl "$1" -i |grep "Model Family"`
POW=`smartctl -A $1 | grep "Power_On_Hours"`
HOURS=`echo $POW |cut -d ' ' -f10`
HEALTH=`smartctl -H "$1" | grep health`
echo "+--------------------------------------"
echo "|Linux Device: $1"
echo "|$MODEL"
echo "|$DEVICE"
echo "|Power on hours: $HOURS"
echo "|$HEALTH"
echo "+--------------------------------------"
else
echo "$1 No detectado"
fi
echo
}
detect_hd /dev/sda
detect_hd /dev/sdb
detect_hd /dev/sdc
detect_hd /dev/sdd
8. Ejecutar desde el escritorio KDE
8.1 Ejecutar smartctl como root
Esto se puede hacer de muchas maneras. Una de ellas es crear un segundo script llamado launcher.sh:
#! /bin/bash
su - -c /home/user/mismart.sh
read -p "Press Enter to continue"
8.2 Añadir un lanzador de apliciones al escritorio
URL konsole -e /home/user/launcher.sh
Permisos: marcar es ejecutable