Вы используете e2fsck
так что я предполагаю, что мы говорим о ext?
файловая система. Команда
tune2fs -l /dev/sdXX
скажет вам очевидное состояние файловой системы (которая может быть смонтирована, это безопасно). Вы получите (среди прочего) либо
Filesystem state: clean
или что-то еще, кроме clean
. Поскольку grep
возвращает false, если совпадение не найдено, ваша основная попытка может быть такой:
tune2fs -l /dev/sdXX | grep "^Filesystem state:[ ]*clean$" || { commands; to; fix; the; filesystem; }
Вышеуказанное будет работать, только если файловая система заранее обнаружит свое нечистое состояние. Иногда вы все равно хотите проверить наличие проблем (вот почему желаемое поведение - fsck
каждого N-го монтирования или по прошествии такого-то количества дней). Если я вас правильно понял, вы пытаетесь узнать, следует ли вам e2fsck -y /dev/sdXX
, анализируя вывод e2fsck -n /dev/sdXX
.
Я говорю не анализировать вывод. Проверьте статус выхода. Смотрите man 8 e2fsck
чтобы узнать:
Код выхода, возвращаемый e2fsck
является суммой следующих условий:
0
- нет ошибок
1
- исправлены ошибки файловой системы
2
- Исправлены ошибки файловой системы, система должна быть перезагружена
4
- Ошибки файловой системы оставлены без исправлений
8
- Операционная ошибка
16
- ошибка использования или синтаксиса
32
- e2fsck
отменен по запросу пользователя
128
- ошибка общей библиотеки
Обратите внимание, что e2fsck -n /dev/sdXX
будет ничего полезного (и вернет "без ошибок"), если файловая система кажется чистой; так что это еще один способ обнаружить текущее видимое состояние, как мы это сделали с tune2fs
. В любом случае, вам нужна опция -f
. Затем вы хотите знать, если статус выхода включает 4
. В bash
это можно сделать с помощью:
e2fsck -nf /dev/sdXX # this is safe even if the filesystem is mounted
status=$?
[ $(( $status & 4 )) -eq 4 ] && { commands; to; fix; the; filesystem; }
Быстрое объяснение:
$?
это состояние выхода последней команды (в данном случае e2fsck
). Я сохраняю его в отдельной переменной, чтобы можно было выполнить несколько тестов с ним. Это не обязательно в этом простом примере, где есть только один тест, но в целом это хорошая практика. Основная причина: после этих строк $status
прежнему содержит состояние выхода e2fsck
и может использоваться повторно, в то время как (новая) $?
не имеет ничего общего с e2fsck
.
$(( ... ))
делает арифметику оболочки
- где
&
- побитовое И,
- затем
[ ... -eq 4 ]
фактически является test
командой для проверки, равен ли результат 4
.
- Если проверка прошла успешно, будет выполнен блок
{ ... }
.
Возможны ошибки не в самой файловой системе, а на более глубоком уровне устройства. Я думаю, что это выходит за рамки этого вопроса, но просто чтобы указать вам правильное направление, если вам это нужно, это полезные команды (обратите внимание на sdX
, а не sdXX
):
smartctl -t long /dev/sdX
badblocks -n -b 512 /dev/sdX
Прочитайте их справочные страницы, прежде чем использовать их.