Używasz, e2fsck
więc zakładam, że mówimy o ext?
systemie plików. Komenda
tune2fs -l /dev/sdXX
pokaże pozorny stan systemu plików (który można zamontować, jest bezpieczny). Dostaniesz też (między innymi)
Filesystem state: clean
lub coś innego niż clean
. Ponieważ grep
zwraca false, jeśli dopasowanie nie zostanie znalezione, podstawowa próba może wyglądać następująco:
tune2fs -l /dev/sdXX | grep "^Filesystem state:[ ]*clean$" || { commands; to; fix; the; filesystem; }
Powyższe będzie działać tylko wtedy, gdy system plików wykryje wcześniej swój stan nieczystości. Czasami i tak chcesz sprawdzić, czy nie występują problemy (dlatego pożądane zachowanie dotyczy fsck
każdego N-tego montażu lub gdy minęła taka i taka liczba dni). Jeśli dobrze zrozumiem, próbujesz dowiedzieć się, czy powinieneś e2fsck -y /dev/sdXX
, analizując wyniki e2fsck -n /dev/sdXX
.
Mówię: nie analizuj wyników. Sprawdź status wyjścia. Zobacz, man 8 e2fsck
aby dowiedzieć się:
Zwrócony kod wyjścia e2fsck
jest sumą następujących warunków:
0
- Brak błędów
1
- Poprawione błędy systemu plików - Poprawione błędy systemu
2
plików, system powinien zostać ponownie uruchomiony
4
- Błędy systemu plików pozostawione nieskorygowane
8
- Błąd operacyjny
16
- Błąd użycia lub błąd składni
32
- e2fsck
anulowany na żądanie użytkownika
128
- Błąd biblioteki współdzielonej
Note e2fsck -n /dev/sdXX
nie zrobi nic użytecznego (i zwróci „brak błędów”), jeśli system plików wydaje się czysty; jest to kolejny sposób na wykrycie obecnego stanu pozornego , tak jak to zrobiliśmy tune2fs
. Aby to sprawdzić, potrzebujesz -f
opcji. Następnie chcesz wiedzieć, czy zawiera status wyjścia4
. W bash
tym może być wykonane z:
e2fsck -nf /dev/sdXX # this is safe even if the filesystem is mounted
status=$?
[ $(( $status & 4 )) -eq 4 ] && { commands; to; fix; the; filesystem; }
Szybkie wyjaśnienie:
$?
jest stanem wyjścia ostatniego polecenia ( e2fsck
w tym przypadku). Zapisuję go w osobnej zmiennej, dzięki czemu mogę wykonać z nią wiele testów. Nie jest to konieczne w tym prostym przykładzie, w którym jest tylko jeden test, ale ogólnie dobra praktyka. Podstawową przyczyną jest to, że po tym wiersze $status
nadal zawierają status wyjścia e2fsck
i mogą być ponownie użyte, podczas gdy (nowy) $?
nie ma z tym nic wspólnego e2fsck
.
$(( ... ))
robi arytmetykę powłoki
- gdzie
&
jest bitowe ORAZ,
- czym
[ ... -eq 4 ]
jest w rzeczywistości test
polecenie, aby sprawdzić, czy wynik jest 4
.
- Jeśli test się powiedzie,
{ ... }
blok zostanie wykonany.
Mogą występować błędy nie w samym systemie plików, ale na głębszym poziomie, na urządzeniu. Myślę, że to nie wchodzi w zakres tego pytania, ale tylko po to, aby wskazać właściwy kierunek, w razie potrzeby, są to przydatne polecenia (zauważ sdX
, że nie sdXX
):
smartctl -t long /dev/sdX
badblocks -n -b 512 /dev/sdX
Przeczytaj strony podręcznika użytkownika przed ich użyciem.