logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

Raw Paste Créer un nouveau Paste

script détection HDD/SDD et analyse SMART - #0E5C976707

  1. #!/bin/bash
  2.  
  3. # dès qu'une erreur est la -> on quitte le programme -> pour le dev
  4. set -e; set -u
  5. # pour debogage
  6. #set -x
  7.  
  8. #Regle bash
  9. # 'commande première partie'"$VARIABLE"'commande deuxième partie'
  10.  
  11. # SI BESOIN installer mailutils
  12.  
  13. USERMAIL=usermail
  14.  
  15. #USERSENDMAIL=user
  16. #USERDESTMAIL=user
  17. #DOMAIN_MAIL=domain.org
  18.  
  19. #function envoie_mail {
  20. # FROM=myuser\<user@domain.org\>
  21. # TO=user@domain.org
  22. # NIVEAU_ALERTE=
  23. # su - myuser -c '(echo "SRV HDD1 - Alerte niveau 2/4 : PERCENT_USED = ${PERCENT_USED}" | mail -s "[URGENT] - SRV HDD1 - Al>
  24. #}
  25.  
  26. # N° de série du SSD via smartctl
  27. SSD=("CT2000BX500SSD1" # Crucial BX 500 2To
  28. "183076804545" # SanDisk SSD PLUS 240GB
  29. "S62BNF0R615469A" # Samsung SSD 870 EVO 500GB
  30. )
  31. # Tera Bytes en ecriture max vu en datasheet ou sur le net
  32. LISTTBWMAX=("720" # Crucial BX 500 2To
  33. "300" # SanDisk SSD PLUS 240GB
  34. "600" # Samsung SSD 870 EVO 500GB
  35. )
  36. TBWMAX=0
  37.  
  38. ### MONITORING HDD1 /dev/sda POUR BAD BLOCK :
  39. ### Current_Pending_Sector & Reallocated sector
  40.  
  41. # récupération de la date et l'heure du jour ; on obtient ici une valeur telle que "mercredi 31 décembre 2014, 00:15:01" :
  42. DATE=`date +"%A %d %B %Y, %H:%M:%S"`
  43.  
  44. # récupération de la date et l'heure du jour sous un autre format ; on obtient ici un résultat sous la forme suivante : XX-YY-ZZZZ (ex: 31-12-2014) :
  45. DATE2=`date +"%d-%m-%Y"`
  46.  
  47. # Collecte des noeuds de disque dur /dev/sda /dev/sdb /dev/sdc , ...
  48. #disk=$(lsblk -l -d -p -n -o NAME,TYPE | awk '($2=="disk"){print $1}')
  49. mapfile -t disk < <(lsblk -l -d -p -n -o NAME,TYPE | awk '($2=="disk"){print $1}')
  50.  
  51. echo "${#disk[@]}"
  52.  
  53. # Pour chaque disque identifié, on analyse les attributs
  54. for d in "${disk[@]}"
  55. #echo ${disk[@]} | while read d ;
  56. do
  57. REALLO=""
  58. PENDING=""
  59. TYPE=""
  60. NAME=""
  61. PERCENT_USED=""
  62. TOTALWRITTEN=""
  63. SECTORSIZE=""
  64. TBWMAX=""
  65.  
  66. echo "COMMENCEMENT"
  67. echo "$d"
  68. DISK=$d
  69. DISK_sub="$(basename $d)"
  70. #DISK_sub=$($d | cut --delimiter=/ --fields=2)
  71. #echo $DISK
  72. echo $DISK_sub
  73. #DISK=/dev/sda
  74.  
  75. # définition du chemin du répertoire à créer :
  76. #REP="/home/jo/Monitoring_hdd1/"
  77. REP="/root/Monitoring_hdd_$DISK_sub/"
  78.  
  79. # Si le répertoire n'existe pas on le crée
  80. if [ ! -d "$REP" ];then
  81. mkdir "$REP"
  82. fi
  83.  
  84. # définition du chemin du répertoire à créer :
  85. REP="/root/Monitoring_hdd_$DISK_sub/$DATE2"
  86.  
  87. # le fichier à créer dans ce répertoire est "pending_sector.csv"
  88. FICHIER="${REP}/pending_sector.csv"
  89.  
  90. # Si le répertoire n'existe pas on le crée
  91. if [ ! -d "$REP" ];then
  92. mkdir "$REP"
  93. fi
  94.  
  95. # Si le fichier n'existe pas on le crée et on y injecte les en tete
  96. if [ ! -f "$FICHIER" ];then
  97. touch "$FICHIER" &&
  98. ( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo "Reallocated bad sectors,pendings sectors" ) > "$FICHIER"
  99. fi
  100.  
  101. TYPE="$(smartctl -a $DISK | grep 'Rotation Rate:' | awk '{print $3$4$5}')"
  102. NAME="$(smartctl -a $DISK | grep 'Device Model' | awk '{print $3}')"
  103.  
  104. echo "$TYPE"
  105.  
  106. #CAS DES SSD
  107. ############
  108. if [ "$TYPE" = "SolidStateDevice" ]; then
  109.  
  110. #echo $(smartctl -a $DISK | grep 'Total_LBAs_Written' | awk '{print $10}')
  111.  
  112. # Récupération des attributs nécessaire
  113. PERCENT_USED="$(smartctl -a $DISK | grep 'Percent_Lifetime_Remain' | awk '{print $10}')"
  114. TOTALWRITTEN="$(smartctl -a $DISK | grep 'Total_LBAs_Written' | awk '{print $10}')"
  115. SECTORSIZE="$(smartctl -a $DISK | grep 'Sector Size' | awk '{print $3}')"
  116.  
  117. # SI SSD NE RENVOIE PAS LE POURCENTAGE UTILISE de Tera Bytes, on le calcul POURCENT_USED=[(TBW*SECTOR_SIZE)/10e-12]
  118.  
  119. for i in "${!SSD[@]}"
  120. do
  121. #echo ${SSD[$i]}
  122. if [ ${SSD[$i]} == "CT2000BX500SSD1" ]; then
  123. TBWMAX=${LISTTBWMAX[$i]}
  124. #echo "i : ",$i
  125. #echo $TBWMAX
  126. else
  127. echo "NO"
  128. fi
  129. done
  130.  
  131. # CAS 1 CLASSIQUE -> SI attribut pourcentage_used!=0
  132. if [ -n "$PERCENT_USED" ]; then
  133.  
  134. echo $PERCENT_USED
  135.  
  136. if [ -n "$PERCENT_USED" ] && [ "$PERCENT_USED" -ge 20 ] && [ "$PERCENT_USED" -lt 30 ]; then
  137. ( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${PERCENT_USED}" ) >> "$FICHIER"
  138. su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 1/4 : PERCENT_USED = '"${PERCENT_USED}"'"% | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 1/4" -aFrom:user\<user@domain.org\> user@domain.org)'
  139.  
  140. #
  141. elif [ -n "$PERCENT_USED" ] && [ "$PERCENT_USED" -ge 30 ] && [ "$PERCENT_USED" -lt 50 ]; then
  142. ( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${PERCENT_USED}" ) >> "$FICHIER"
  143. su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 2/4 : PERCENT_USED = '"${PERCENT_USED}"'"% | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 2/4" -aFrom:user\<user@domain.org\> user@domain.org)'
  144.  
  145. #
  146. elif [ -n "$PERCENT_USED" ] && [ "$PERCENT_USED" -ge 50 ] && [ "$PERCENT_USED" -lt 80 ]; then
  147. ( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${PERCENT_USED}" ) >> "$FICHIER"
  148. su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 3/4 : PERCENT_USED = '"${PERCENT_USED}"'"% | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 3/4" -aFrom:user\<user@domain.org\> user@domain.org)'
  149.  
  150. elif [ -n "$PERCENT_USED" ] && [ "$PERCENT_USED" -ge 80 ] && [ "$PERCENT_USED" -lt 100 ]; then
  151. ( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${PERCENT_USED}" ) >> "$FICHIER"
  152. su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 4/4 : PERCENT_USED = '"${PERCENT_USED}"'"% | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 4/4" -aFrom:user\<user@domain.org\> user@domain.org)'
  153.  
  154. fi
  155.  
  156. # CAS 2 : BESOIN DE CALCUL DU POURCENTAGE_USED SI Total Written!=0 & TBWMAX!=0
  157. elif [ -z "$PERCENT_USED" ] && [ -n "$TOTALWRITTEN" ] && [ -z "$TOTALWRITTEN" ] && [ -n "$TBWMAX" ]; then
  158.  
  159. # CALCUL POURCENTAGE UTILISE FONCTION DU PARAM TBWMAX DU SSD
  160. echo $TBWMAX
  161.  
  162. echo $TOTALWRITTEN
  163. #EXEMPLE -> TOTALWRITTEN=7800211101 octets #SECTORSIZE=512 #TBWMAX (dépend de chaque SSD)=720TB
  164.  
  165. TBW=$(( ( $TOTALWRITTEN * $SECTORSIZE ) /1000000000000 ))
  166. echo $TBW
  167. PERCENT_USED=$(( ($TBW*100/$TBWMAX) ))
  168. echo $PERCENT_USED
  169. su - $USERMAIL -c '(echo "$HOSTNAME - Disque dur $NAME" | mail -s "CALCUL DU POURCENTAGE UTILISATION TBW - $HOSTNAME -aFrom:user\<user@domain.org\> user@domain.org)'
  170.  
  171. if [ -n "$PERCENT_USED" ] && [ "$PERCENT_USED" -ge 20 ] && [ "$PERCENT_USED" -lt 30 ]; then
  172. ( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${PERCENT_USED}" ) >> "$FICHIER"
  173. su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 1/4 : PERCENT_USED = '"${PERCENT_USED}"'"% | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 1/4" -aFrom:user\<user@domain.org\> user@domain.org)'
  174.  
  175. #
  176. elif [ -n "$PERCENT_USED" ] && [ "$PERCENT_USED" -ge 30 ] && [ "$PERCENT_USED" -lt 50 ]; then
  177. ( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${PERCENT_USED}" ) >> "$FICHIER"
  178. su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 2/4 : PERCENT_USED = '"${PERCENT_USED}"'"% | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 2/4" -aFrom:user\<user@domain.org\> user@domain.org)'
  179.  
  180. #
  181. elif [ -n "$PERCENT_USED" ] && [ "$PERCENT_USED" -ge 50 ] && [ "$PERCENT_USED" -lt 80 ]; then
  182. ( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${PERCENT_USED}" ) >> "$FICHIER"
  183. su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 3/4 : PERCENT_USED = '"${PERCENT_USED}"'"% | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 3/4" -aFrom:user\<user@domain.org\> user@domain.org)'
  184.  
  185. elif [ -n "$PERCENT_USED" ] && [ "$PERCENT_USED" -ge 80 ] && [ "$PERCENT_USED" -lt 100 ]; then
  186. ( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${PERCENT_USED}" ) >> "$FICHIER"
  187. su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 4/4 : PERCENT_USED = '"${PERCENT_USED}"'"% | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 4/4" -aFrom:user\<user@domain.org\> user@domain.org)'
  188.  
  189. fi
  190.  
  191. # CAS 3 : BESOIN ASSOCIATION TBWMAX A AU TABLEAU EN DEBUG DE PROG
  192. else
  193. su - $USERMAIL -c '(echo "$HOSTNAME - PAS ASSEZ DE DATA POUR TRAITER LE NOUVEAU SSD, PRENDRE ATTRIBUTS SMART POUR CALCUL / OU associer son TBWMAX au tableau du script hdd_bad_block_sda.sh " | mail -s "[URGENT] - $HOSTNAME - PAS ASSEZ DE DATA POUR TRAITER LE NOUVEAU SSD, associer son TBWMAX au tableau du script hdd_bad_block_sda.sh" -aFrom:user\<user@domain.org\> user@domain.org)'
  194. fi
  195.  
  196.  
  197. #CAS DES HDD
  198. ############
  199. elif [ "$TYPE" != "SolidStateDevice" ]; then
  200.  
  201. # Reallocated bad sectors
  202. #REALLO=$(smartctl -a /dev/sda | grep 'Reallocated_Sector_Ct' | awk '{print $10}')
  203. REALLO="$(smartctl -a $DISK | grep 'Reallocated_Sector_Ct' | awk '{print $10}')"
  204. # récupération des pendings sectors
  205. #PENDING=$(smartctl -a /dev/sda | grep 'Current_Pending_Sector' | awk '{print $10}')
  206. PENDING="$(smartctl -a $DISK | grep 'Current_Pending_Sector' | awk '{print $10}')"
  207.  
  208. if [ -z "$PENDING" ]; then
  209. su - $USERMAIL -c '(echo "$HOSTNAME - Revoir Attribut Pending Smartctl : PENDING" | mail -s "[URGENT] - $HOSTNAME - Revoir Attribut Pending Smartctl : PENDING-> du changement HDD ou SSD ou disque Mort" -aFrom:user\<user@domain.org\> user@domain.org)'
  210. elif [ -z "$REALLO" ]; then
  211. su - $USERMAIL -c '(echo "$HOSTNAME - Revoir Attribut Reallo Smartctl : REALLO" | mail -s "[URGENT] - $HOSTNAME - Revoir Attribut Reallo Smartctl : REALLO -> du changement HDD ou SSD ou disque Mort" -aFrom:user\<user@domain.org\> user@domain.org)'
  212. fi
  213.  
  214. # Reallocated sector -> Prevention des bad sectors HDD
  215. #if [ -n "$REALLO" ] && [ "$REALLO" -ge 0 ] && [ "$REALLO" -lt 5 ]; then
  216. # ( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${REALLO},${PENDING}" ) >> "$FICHIER"
  217. #su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 0/5 : reallocated visible < '"${REALLO}"'" | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 0/5" -aFrom:user\<user@domain.org\> user@domain.org)'
  218.  
  219. # Tests bad sector en attente de reallocation -> si plus de reallocated sector -> perte de data ?
  220.  
  221. # Current_Pending_Sector < 5 && Reallocated sector > 5
  222. if [ -n "$PENDING" ] && [ -n "$REALLO" ] && [ "$PENDING" -lt 5 ] && [ "$REALLO" -ge 5 ]; then
  223. ( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${REALLO},${PENDING}" ) >> "$FICHIER"
  224. su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 1/5 : reallocated visible,bad sector < '"${REALLO} ${PENDING}"'" | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 1/5" -aFrom:user\<user@domain.org\> user@domain.org)'
  225.  
  226. # Current_Pending_Sector (> 5 & < 20) && Reallocated sector > 5
  227. elif [ -n "$PENDING" ] && [ -n "$REALLO" ] && [ "$PENDING" -ge 5 ] && [ "$PENDING" -lt 20 ] && [ "$REALLO" -ge 5 ]; then
  228. ( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${REALLO},${PENDING}" ) >> "$FICHIER"
  229. su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 2/5 : reallocated visible,bad sector < '"${REALLO},${PENDING}"'" | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 2/5" -aFrom:user\<user@domain.org\> user@domain.org)'
  230.  
  231. # Current_Pending_Sector (> 20 & < 50) && Reallocated sector > 5
  232. elif [ -n "$PENDING" ] && [ -n "$REALLO" ] && [ "$PENDING" -ge 20 ] && [ "$PENDING" -lt 50 ] && [ "$REALLO" -ge 5 ]; then
  233. ( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${REALLO},${PENDING}" ) >> "$FICHIER"
  234. su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 3/5 : reallocated visible,bad sector < '"${REALLO},${PENDING}"'" | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 3/5" -aFrom:user\<user@domain.org\> user@domain.org)'
  235.  
  236. # Current_Pending_Sector (> 50 & < 100) && Reallocated sector > 5
  237. elif [ -n "$PENDING" ] && [ -n "$REALLO" ] && [ "$PENDING" -ge 50 ] && [ "$PENDING" -lt 100 ] && [ "$REALLO" -ge 5 ]; then
  238. ( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${REALLO},${PENDING}" ) >> "$FICHIER"
  239. su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 4/5 : reallocated visible,bad sector < '"${REALLO},${PENDING}"'" | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 4/5" -aFrom:user\<user@domain.org\> user@domain.org)'
  240.  
  241. # Current_Pending_Sector > 100 && Reallocated sector > 5
  242. elif [ -n "$PENDING" ] && [ -n "$REALLO" ] && [ "$PENDING" -ge 100 ] && [ "$REALLO" -ge 5 ]; then
  243. ( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${REALLO},${PENDING}" ) >> "$FICHIER"
  244. su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 5/5 : reallocated visible,bad sector < '"${REALLO},${PENDING}"'" | mail -s "[CRITIQUE] - $HOSTNAME - Alerte niveau 5/5" -aFrom:user\<user@domain.org\> user@domain.org)'
  245. #sudo shutdown -h now
  246. fi
  247. fi
  248. done
  249. exit 0

Pied de page des forums

Propulsé par FluxBB