проблемы диска freenas - умная ошибка - как восстановить набег zfs?

Этот ответ относится не к уже объясненной проблеме случая , а к проблеме соответствия.

Сначала нам нужно определить, как могут выглядеть валидные строки. Самое простое определение, конечно, допускает только одну структуру типа

  1. , начинающуюся с одной или нескольких цифр (допускаются ведущие нули)
  2. десятичная точка
  3. две трейлинговые цифры (если необходимо 00)
  4. Долларовый знак (без лидирующего пробела)

В качестве регулярного выражения (для e. g. grep, см. man 7 regex) это будет написано так:

^[0-9]+\.[0-9][0-9]\$$
  • ^ отмечает начало строки, т.е. перед [0-9]+
  • Точка экранируется \. для того, чтобы считаться буквальной точкой
  • Знак доллара escaped \$ для того, чтобы считаться буквальным
  • , трейлинг $ обозначает конец строки, т.е. после литерала $

Testing:

> echo '0123.45$' | grep -E '^[0-9]+\.[0-9][0-9]\$$'
0123.45$

Если определение изменено таким образом, что и точка с трейлинговыми цифрами, и знак доллара являются необязательными, то регекс изменится на

^[0-9]+(\.[0-9][0-9])?\$?$

Testing:

> echo '0123$' | grep -E '^[0-9]+\.[0-9][0-9]\$$'

# no match
> echo '0123$' | grep -E '^[0-9]+(\.[0-9][0-9])?\$?$'
0123$
> echo '0123.45$' | grep -E '^[0-9]+(\.[0-9][0-9])?\$?$'
0123.45$

Оболочка может работать с регулярными выражениями напрямую, но не в рамках шаблонов case. Вам нужна структура [[]]. Но так как вы хотите знать только соответствует строка или нет, то нет причин использовать case:

if [[ "$price" =~ ^[0-9]+(\.[0-9][0-9])?\$?$ ]]; then
  :
else
  :
fi

Если вам действительно нужен case, то вы можете установить опцию extglob с помощью булитина оболочки shopt и переписать регекс в "shell regex":

shopt -s extglob

^[0-9]+(\. [0-9][0-9])?\$?$ становится тогда

+([0-9])?(.[0-9][0-9])?($)

ведущим $

, если вы хотите $0123.45 вместо 0123. 45$ тогда вы, очевидно, должны поставить чек на $ в начале:

  • grep /[[ ]]: ^\$?[0-9]+(\.[0-9][0-9])?$
  • соответствие паттерна оболочки: ?($)+([0-9])?(.[0-9][0-9])

более простая проверка

Если вас не волнует порядок, а только правильные символы, то вы можете использовать гораздо более простые выражения:

  • grep /[[ ]]: ^[0-9.$]+$
  • сравнение паттерна оболочки: +([0-9.$])

пример

#! /bin/bash

shopt -s extglob

for value in 1234 1234EUR; do
    case "$value" in
            +([0-9]))
                    echo "value OK: '${value}'"
            ;;
            *)
                    echo "value not OK: '${value}'"
            ;;
    esac
done
0
22.01.2015, 10:35
1 ответ

У нас была эта ошибка у пары клиентов, DRDY ERR. Воспринимаемая ситуация заключалась в снижении скорости / производительности с большим количеством (очень большим числом) Raw_Read_Error_Rate.

К сожалению, эти ошибки обычно не являются доброкачественными, ожидаемая скорость при копировании файлов составляла 42–100 МБ / с и упала до менее 2 МБ / с за 60–90 секунд при копировании только 2 ГБ данных с последующим отказом. На самом деле это была проблема с контроллером SATA.

После проверки журналов мы сделали все необходимое для отказа оборудования. Была заменена материнская плата, заменены рейд-контроллеры, а также старые внебиржевые жесткие диски снова были заменены заводскими сертифицированными устройствами. Все идеально, хорошо и быстро после надлежащего ухода. Хотя дороговизна.

Dec 17 12:24:15 JoaoLuiz (ada0:ata3:0:0:0): WRITE_DMA. ACB: ca 00 00 00 00 40 00 00 00 00 00 00
Dec 17 12:24:15 JoaoLuiz (ada0:ata3:0:0:0): CAM status: ATA Status Error
Dec 17 12:24:15 JoaoLuiz (ada0:ata3:0:0:0): ATA status: 51 (DRDY SERV ERR),  error: 84 (ICRC ABRT )
Dec 17 12:24:15 JoaoLuiz (ada0:ata3:0:0:0): RES: 51 84 10 00 00 00 00 00 00 f0 00
Dec 17 12:24:15 JoaoLuiz (ada0:ata3:0:0:0): Retrying command
<about 10.000 DRDY SERV ERRs were enough to command maitenance>

Салют!

1
28.01.2020, 02:51

Теги

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