Сценарий bash для выполнения команды после завершения восстановления RAID

#!/bin/bash
first=$( head -n1 file | awk -F" +" '{print $2}' )
last=$( tail -n1 file | awk -F" +" '{print $2}' )
for (( i=$first ; i<=$last ; i=i+10000 )) ; do
   awk -v start=$i -v end=$(($i+10000)) 'BEGIN { FS == " +" } { if ( $2 >= start && $2 < end ) print $0 }' file \
   >> interval_"$i"_to_"$(( $i+10000 ))"
done

Тест с интервалом 100:

more inter*
::::::::::::::
interval_61336212_to_61346212
::::::::::::::
chr19   61336212        +       0       0       CG      CGT    
chr19   61336213        -       0       0       CG      CGG    
chr19   61336218        +       0       0       CG      CGG    
chr19   61336219        -       0       0       CG      CGC    
chr19   61336268        +       0       0       CG      CGG    
chr19   61336269        -       0       0       CG      CGA    
::::::::::::::
interval_61336312_to_61346312
::::::::::::::
chr19   61336402        +       0       0       CG      CGG    
chr19   61336403        -       0       0       CG      CGT  

Примечание: вместо пустых интервалов будут создаваться пустые файлы; для удаления пустых файлов добавьте:

for file in interval* ; do
  if [ ! -s "$file" ] ; then
    rm "$file"
  fi
done

Будет запускать файл для каждого шага в цикле for , поэтому не самый эффективный.

1
09.02.2018, 12:34
2 ответа

Соответствующая часть /proc/mdstatвыглядит так, как показано ниже, где Uозначает устройство, находящееся в состоянии «включено», а _устройство, находящееся в состоянии «внизу». Когда он восстанавливается, устройства отображаются как «неработающие», поэтому мы можем подождать, пока все устройства снова не «включятся».

md0 : active raid5 sda1[0] sdd1[2] sdb1[1]
     1465151808 blocks level 5, 64k chunk, algorithm 2 [4/3] [UUU_]

Вот примерно так:

dev=md0
until grep -A1 "^$dev :" /proc/mdstat | grep -q '\[UU*\]' ; do
    sleep 2
done 
run some command here...

(Первый grepищет заданное имя устройства, а grep -A1печатает соответствующую строку плюс еще одну после. Второй ищет строку Uмежду скобками.)

Конечно, это никогда не проверяет, выполнялось ли восстановление в первую очередь, нам потребуется более разумная логика для интерпретации полного вывода, поскольку количество строк вывода варьируется.

2
27.01.2020, 23:32

Я делаю это в Ubuntu 18.04LTS, поэтому, возможно, grepотличается, но A1дает вам одну строку, поэтому ваша проверка не работает. Я изменил его на grep -A2и теперь могу, по крайней мере, вернуть то, о чем вы говорите, с помощью:

dev=md0
foo=$(grep -A2 "^$dev :" /proc/mdstat);echo $foo

Пример вывода:

md0 : active raid5 sdh1[0] sdg1[1] sdf1[2] sde1[4] 8790399744 blocks super 1.2 level 5, 256k chunk, algorithm 2 [4/4] [UUUU] bitmap: 0/22 pages [0KB], 65536KB chunk

Итак, я думаю, следует читать:

dev=md0
until grep -A2 "^$dev :" /proc/mdstat | grep -q '\[UU*\]' ; do
    sleep 2
done 
Whatever you want to do goes here.

Ура!

0
27.01.2020, 23:32

Теги

Похожие вопросы