Re: Bash expression to detect dying RAID devices
Hi Roger,
On Tue, Dec 24, 2024 at 03:45:31PM +0100, Roger Price wrote:
> File /proc/mdstat indicates a dying RAID device with an output section such
> as
>
> md3 : active raid1 sdg6[0]
> 871885632 blocks super 1.0 [2/1] [U_]
> bitmap: 4/7 pages [16KB], 65536KB chunk
>
> Note the [U-]. The "-" says /dev/sdh is dead. I would like to scan
> /proc/mdstat and set a flag if [U-], [-U] or [--] occur.
I am confused. The sample output you provide includes '_' rather than
'-', but your script and all of the tests which it performs are trying
to match '-' (which isn't part of the output).
> My current attempt is
>
> #! /bin/bash -u
> set -x
> BAD=0;
> while read L;
> do if [[ $L == *"[U-]"* ]]; then B=1; fi;
> if [[ $L == *"[-U]"* ]]; then B=1; fi;
> if [[ $L == *"[--]"* ]]; then B=1; fi;
> done < /proc/mdstat;
> echo $BAD
>
Also, you assign BAD=0, then echo $BAD, but your loop assigns B=1
(rather than BAD=1). Even if you managed to find a test that matched,
your script would still always echo 0.
> Far from elegant, but I still can't get it to work.
> The trace contains lines such as
>
> + 1164021 1164021 [4]read L
> + 1164021 1164021 [5][[ 20970368 blocks super 1.0 [2/1] [U_] == *\[\U\-\]* ]]
>
> The test always fails, but I can't see why. Any hint would be very welcome.
>
I think that '==' is the wrong tool. That is testing for string
equality, whilst you are looking for a partial match. This is what I was
able to get working after hacking on it for a minute or two:
#! /bin/bash -u
set -x
BAD=0;
while read L;
do if [[ $L =~ \[(U_|_U|__)\] ]]; then BAD=1; break; fi;
done < /proc/mdstat;
echo $BAD
Note that I changed to a regex match, and also added a 'break;' after
assigning BAD=1, because there is no need to continue processing the
input at that point.
Regards and Merry Christmas,
-Roberto
--
Roberto C. Sánchez
Reply to: