Etiquetas

555 74HC04 74HC14 74HC165 74LS04 acentos ADC10 Amstrad archivo arduino aristóteles armbian array ass at backup base64 bash Basho bc beethoven Biblia blog bucle c c++ c++11 c++17 C005 cadena Carmina Burana casting CD4017 CD4040 Cine clases Colores connect Consolación a Helvia Consolación a Marcia Consolación a Polibio constante corsair CPC Cristal 32Khz css cursor mouse cut daemon date dead keys Debian directorio disco duro DS32kHz electricidad Electrónica ensamblador entryList epicureismo Estadística estoicismo felicidad ffmpeg filePath filosofia Filosofía firefox flac for fstab funcion Gargantúa gastronomía gilgamesh Ginott gmp gpt grep gtts Hobbes hotkeys html imagemagick inline Javascript kde kernel modulos latex ldr lib-notify Linux Literatura ludoteca macro mapa de bits Matroska mega Microsoft Word Milan Kundera mkvextract mkvinfo mount mp3 mplayer MSP430 msp430F5529 MSP432 Multimedia Musica oop orange_pi pato PIR PL9823 Platón poesía POO en C++ pulseaudio puntero PWM pygame pyqt python QAction qApp QApplication QByteArray QDialog Qdir QFile QFileDialog QImage qlabel QList QListWidget QMessagebox QMouseEvent qpainter QPalette QPixmap QProcess QRegularExpression QRegularExpressionMatchIterator QString QStringList Qt qt5 QToolbar quijote QVector qwidget R Rabelais ratón relé Resonador cerámico samba San Agustín screen Séneca signal slot smart smartctl sox srt static const stdarg.h subtítulos Symbian tar teléfonos móviles temperatura temperatura cpu Temporizador tesseract Timer timestamp Trigonometría tts tutorial uid unicode user USI va_arg va_end va_list va_start velocidad ventilador Voltaire wallpaper xboxdrv xinput xrandr Z80 zip

miércoles, enero 11, 2023

Creación de un script en bash para facilitar la comprensión de la salida de smartctl, paso a paso,

Recuerda:


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 

Un bloque if muy básico. La instrucción ls devuelve un código de error 0 en caso de éxito. Aquí se examina el valor devuelto.

    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