Retrait su -c, Gestion si lancement via Cron ou Shell
Doit pour le moment être lancé en root (ou via tâche cron de root).
This commit is contained in:
parent
9090c626fd
commit
6c05951e7d
131
sante_disk.bash
131
sante_disk.bash
|
@ -1,8 +1,15 @@
|
|||
#!/bin/bash
|
||||
|
||||
su -c'
|
||||
#Si votre fichier de script est appelé par cron et qu il contient un shell à la première ligne du type #!/Bin/bash , vous devez rechercher le nom parent-parent correspondant à vos besoins.
|
||||
PPPID=`ps h -o ppid= $PPID` #Le PID parent est disponible dans bash en tant que variable $ PPID . La commande ps permettant d'obtenir le PID parent du PID parent
|
||||
P_COMMAND=`ps h -o %c $PPPID` #On recupere le nom de la commande
|
||||
if [ "$P_COMMAND" == "cron" ]; then
|
||||
RUNNING_FROM_CRON=1
|
||||
else
|
||||
RUNNING_FROM_CRON=0
|
||||
fi
|
||||
|
||||
OUTPUT=($(lsscsi -g | grep "disk" | grep -v "Virtual Disk" | grep -o "/dev/sg[0-9]" | paste -sd '\'' '\'')) #Liste des disques non virtuels
|
||||
OUTPUT=($(lsscsi -g | grep "disk" | grep -v "Virtual Disk" | grep -o "/dev/sg[0-9]" | paste -sd ' ')) #Liste des disques non virtuels
|
||||
DISKS=() #Array vide dans lequel on mettra les disques a tester
|
||||
ARRAY_TEMPS=() #Creation d un array vide pour temps de selftest
|
||||
LOG=($(eval echo ~$USER/SANTE_DISK)) #Chemin du fichier de sortie du test (dans le repertoire home de l utilisateur)
|
||||
|
@ -11,66 +18,81 @@ FIN_TEST="NOK"
|
|||
|
||||
for i in "${PACKAGES[@]}" #Verification et installation des paquets necessaires
|
||||
do
|
||||
if ! dpkg -s $i >/dev/null 2>&1; then
|
||||
echo "Installation du paquet "$i""
|
||||
apt install $i
|
||||
fi
|
||||
if ! dpkg -s $i >/dev/null 2>&1; then
|
||||
echo "Installation du paquet "$i""
|
||||
apt install $i
|
||||
fi
|
||||
done
|
||||
|
||||
for i in "${OUTPUT[@]}" #Selection des disques ayant SMART a Enabled
|
||||
do
|
||||
if /usr/sbin/smartctl -i $i | grep "SMART support is: Enabled" >/dev/null 2>&1; then
|
||||
DISKS+=($i)
|
||||
fi
|
||||
if /usr/sbin/smartctl -i $i | grep "SMART support is: Enabled" >/dev/null 2>&1; then
|
||||
DISKS+=($i)
|
||||
fi
|
||||
done
|
||||
|
||||
for i in "${DISKS[@]}" #Boucle de test sur chaque disque
|
||||
do
|
||||
DUREE_TEST_VAN=($(/usr/sbin/smartctl -c "$i" | grep "polling" | grep -Eo '\''[0-9]{1,}'\'' | paste -sd '\'' '\'')) #Extraction des temps de polling dans les capacites SMART du disque (seulement le chiffre, en minutes).
|
||||
DUREE_TEST=0
|
||||
for j in "${DUREE_TEST_VAN[@]}"
|
||||
do
|
||||
if (("$j" > DUREE_TEST)); then
|
||||
DUREE_TEST="$j"
|
||||
fi
|
||||
done
|
||||
ARRAY_TEMPS+=($DUREE_TEST)
|
||||
/usr/sbin/smartctl -t long "$i" > /dev/null 2>&1
|
||||
MODEL=($(/usr/sbin/smartctl -i $i | grep "Device Model:" | sed "s/Device Model: //g"))
|
||||
echo "Le selftest pour le disque ${MODEL[@]} ($i) prendra $DUREE_TEST minutes."
|
||||
if [ "$RUNNING_FROM_CRON" == "0" ]; then
|
||||
DUREE_TEST_VAN=($(/usr/sbin/smartctl -c "$i" | grep "polling" | grep -Eo '[0-9]{1,}' | paste -sd ' ')) #Extraction des temps de polling dans les capacites SMART du disque (seulement le chiffre, en minutes).
|
||||
DUREE_TEST=0
|
||||
for j in "${DUREE_TEST_VAN[@]}"
|
||||
do
|
||||
if (("$j" > DUREE_TEST)); then
|
||||
DUREE_TEST="$j"
|
||||
fi
|
||||
done
|
||||
ARRAY_TEMPS+=($DUREE_TEST)
|
||||
MODEL=($(/usr/sbin/smartctl -i $i | grep "Device Model:" | sed "s/Device Model: //g"))
|
||||
echo "Le selftest pour le disque ${MODEL[@]} ($i) prendra $DUREE_TEST minutes."
|
||||
fi
|
||||
/usr/sbin/smartctl -t long "$i" > /dev/null 2>&1
|
||||
done
|
||||
echo ""
|
||||
if [ "$RUNNING_FROM_CRON" == "0" ]; then
|
||||
echo ""
|
||||
|
||||
TEMPS_MAX=0 #RAZ du temps de polling
|
||||
|
||||
for i in "${ARRAY_TEMPS[@]}" #recherche de la valeur max dans les temps de polling extraits
|
||||
do
|
||||
if (("$i" > $TEMPS_MAX))
|
||||
then TEMPS_MAX="$i"
|
||||
fi
|
||||
done
|
||||
TEMPS_MAX=0 #RAZ du temps de polling
|
||||
|
||||
for i in "${ARRAY_TEMPS[@]}" #recherche de la valeur max dans les temps de polling extraits
|
||||
do
|
||||
if (("$i" > $TEMPS_MAX))
|
||||
then TEMPS_MAX="$i"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
while [ "$FIN_TEST" = "NOK" ] #On boucle tant qu au moins un disque n a pas fini son selftest
|
||||
do
|
||||
FIN_TEST="OK"
|
||||
for i in "${DISKS[@]}"
|
||||
do
|
||||
MODEL=($(/usr/sbin/smartctl -i $i | grep "Device Model:" | sed "s/Device Model: //g"))
|
||||
if /usr/sbin/smartctl -c "$i" | grep "Self-test routine in progress" > /dev/null 2>&1; then #Si scan non fini
|
||||
FIN_TEST="NOK" #On repasse la variable FIN_TEST a FALSE
|
||||
TEMPS=($(date +"%T"))
|
||||
POURCENTAGE_RESTANT=($(/usr/sbin/smartctl -c "$i" | grep "% of test remaining"))
|
||||
echo "$TEMPS : $POURCENTAGE_RESTANT du selftest restant sur le disque ${MODEL[@]} ($i)."
|
||||
else
|
||||
echo "$TEMPS : selftest terminé sur le disque ${MODEL[@]} ($i)."
|
||||
fi
|
||||
done
|
||||
echo ""
|
||||
if [ "$FIN_TEST" = "NOK" ]; then
|
||||
sleep 5m #On attend pour relancer la boucle de test de statut
|
||||
fi
|
||||
FIN_TEST="OK"
|
||||
for i in "${DISKS[@]}"
|
||||
do
|
||||
MODEL=($(/usr/sbin/smartctl -i $i | grep "Device Model:" | sed "s/Device Model: //g"))
|
||||
if /usr/sbin/smartctl -c "$i" | grep "Self-test routine in progress" > /dev/null 2>&1; then #Si scan non fini
|
||||
FIN_TEST="NOK" #On repasse la variable FIN_TEST a FALSE
|
||||
if [ "$RUNNING_FROM_CRON" == "0" ]; then
|
||||
TEMPS=($(date +"%T"))
|
||||
POURCENTAGE_RESTANT=($(/usr/sbin/smartctl -c "$i" | grep "% of test remaining"))
|
||||
echo "$TEMPS : $POURCENTAGE_RESTANT du selftest restant sur le disque ${MODEL[@]} ($i)."
|
||||
fi
|
||||
else
|
||||
if [ "$RUNNING_FROM_CRON" == "0" ]; then
|
||||
echo "$TEMPS : selftest terminé sur le disque ${MODEL[@]} ($i)."
|
||||
fi
|
||||
fi
|
||||
done
|
||||
echo ""
|
||||
if [ "$FIN_TEST" = "NOK" ]; then
|
||||
sleep 5m #On attend pour relancer la boucle de test de statut
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$RUNNING_FROM_CRON" == "0" ]; then
|
||||
echo "**************************************************"
|
||||
echo "***** TESTS TERMINES ET LOG DISPONIBLE SOUS *****"
|
||||
echo "************ $LOG *************"
|
||||
echo "**************************************************"
|
||||
echo ""
|
||||
echo "Le test de l'ensemble des disques a pris $TEMPS_MAX minutes."
|
||||
read
|
||||
fi
|
||||
date > $LOG #RAZ fichier de sortie + inscription date
|
||||
|
||||
for i in "${DISKS[@]}" #Boucle d inscription des résultats dans le fichier de sortie
|
||||
|
@ -85,13 +107,6 @@ do
|
|||
/usr/sbin/smartctl -H -A -l selftest "$i" >> $LOG
|
||||
echo " " >> $LOG
|
||||
done
|
||||
|
||||
echo "**************************************************
|
||||
***** TESTS TERMINES ET LOG DISPONIBLE SOUS *****
|
||||
************ $LOG *************
|
||||
**************************************************"
|
||||
|
||||
echo "Le test de l'\''ensemble des disques a pris $TEMPS_MAX minutes."
|
||||
|
||||
cat $LOG | /usr/bin/mailx -s "Sante des disques sur $HOSTNAME" $USER@$HOSTNAME #envoi de mail
|
||||
read'
|
||||
if [ "$RUNNING_FROM_CRON" == "1" ]; then
|
||||
cat $LOG | /usr/bin/mailx -s "Sante des disques sur $HOSTNAME" root@$HOSTNAME #envoi de mail
|
||||
fi
|
Loading…
Reference in New Issue