Advertisement
Guest User

z_hot_disc_remover.sh

a guest
Aug 20th, 2014
353
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 2.05 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. DATE=`date +%d.%m.%y %H:%M:%S`
  4. raids="/proc/mdstat"
  5. log_file="/var/log/raid_recover.log"
  6. removed_disc=$1
  7.  
  8. sleep 5
  9. echo $DATE "Hot removed disc - $removed_disc" >> $log_file
  10. # опросить массивы - проявить полупустые
  11. for md in `cat $raids | grep "md[0-9]" | awk '{print $1}' | sort -n`
  12. do
  13.   hdparm -t /dev/$md 1>/dev/null
  14. done
  15.  
  16. # перебираем массивы, ищем с дисками имеющими статус (F)
  17. for md in `cat $raids | grep md[0-9] | grep "(F)" | awk '{print $1}' | sort -n`
  18. do
  19. # проверка на наличие минимум двух дисков (вдруг остался ТОЛЬКО один, и тот "(F)")
  20.   if [ `cat $raids | grep $md | awk 'match($0,/sd[a-z][0-9].*/) {print substr($0,RSTART,RLENGTH)}' | awk '{print NF}'` -ge 2 ]
  21.   then
  22. # получаем имя отвалившегося раздела
  23.     for fail_part in `cat $raids | grep $md | awk '/F/{for(i=1;i<=NF;++i)if($i~/F/)print $i}' | sed 's/\[[0-9\]](F)//g' | sort -n`
  24.     do
  25.       echo $DATE "Found F state partition - $fail_part on $md" >> $log_file
  26. # если раздел(диск) ещё в системе -
  27.       if [[ `cat /proc/partitions | grep $fail_part` ]]
  28.       then
  29. # удаляем
  30.         mdadm /dev/$md -r /dev/$fail_part
  31.       else
  32. # если раздел из массива не удаляется по причине отсутствия в системе
  33.         if [[ `mdadm /dev/$md -r /dev/$fail_part 2>&1 | grep -i "no such" | grep $fail_part` ]]
  34.         then
  35. # удаляем его по-другому
  36.           mdadm /dev/$md --remove detached
  37.           echo $DATE "No such $fail_part, it removed as detached" >> $log_file
  38.         fi
  39.           echo $DATE "$fail_part was removed from $md" >> $log_file
  40. # сигналим при удалении раздела из массива
  41.           for i in {1..15} ; do beep -f 840 -l 20 -n -f 2400 -l 20 ; done
  42. # cспим 0,5 секунды чтобы можно было различить отдельные сигналы
  43.           sleep 1
  44.       fi
  45.     done
  46.   fi
  47. echo "**" >> $log_file
  48. done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement