Вы используете, 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
- Ошибка общей библиотеки
Note 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
Прочитайте их справочные страницы, прежде чем использовать их.