Sie verwenden e2fsck
also, ich gehe davon aus, dass wir über ext?
Dateisysteme sprechen . Der Befehl
tune2fs -l /dev/sdXX
zeigt Ihnen den scheinbaren Zustand des Dateisystems an (das gemountet werden kann, es ist sicher). Sie werden (unter anderem) entweder bekommen
Filesystem state: clean
oder etwas anderes als clean
. Weil grep
false zurückgegeben wird, wenn die Übereinstimmung nicht gefunden wird, kann Ihr grundlegender Versuch folgendermaßen aussehen:
tune2fs -l /dev/sdXX | grep "^Filesystem state:[ ]*clean$" || { commands; to; fix; the; filesystem; }
Das obige funktioniert nur, wenn das Dateisystem zuvor seinen unreinen Zustand erkannt hat. Manchmal möchten Sie ohnehin nach Problemen suchen (deshalb ist das gewünschte Verhalten bei fsck
jedem n-ten Mount oder wenn eine solche Anzahl von Tagen vergangen ist). Wenn ich Ihnen recht verstehe, versuchen Sie e2fsck -y /dev/sdXX
, durch Analyse der Ausgabe von zu erfahren, ob Sie dies sollten e2fsck -n /dev/sdXX
.
Ich sage nicht die Ausgabe analysieren. Überprüfen Sie den Exitstatus. Sehen man 8 e2fsck
, um zu lernen:
Der zurückgegebene Exit-Code
e2fsck
ist die Summe der folgenden Bedingungen:
0
- Keine Fehler
1
- Dateisystemfehler wurden korrigiert
2
- Dateisystemfehler wurden korrigiert, das System sollte neu gestartet werden
4
- Dateisystemfehler wurden nicht korrigiert
8
- Betriebsfehler
16
- Verwendungs- oder Syntaxfehler
32
-e2fsck
Abbruch durch Benutzeranfrage
128
- Fehler in der gemeinsam genutzten Bibliothek
Hinweis e2fsck -n /dev/sdXX
tut nichts nützlich (und es wird wieder „keine Fehler“), wenn das Dateisystem scheint klar; Dies ist also eine andere Möglichkeit, den augenscheinlichen Zustand zu erkennen, wie wir es mit getan haben tune2fs
. Um trotzdem zu prüfen, benötigen Sie eine -f
Option. Dann möchten Sie wissen, ob der Exit-Status Folgendes enthält4
. In bash
diesem kann mit gemacht werden:
e2fsck -nf /dev/sdXX # this is safe even if the filesystem is mounted status=$? [ $(( $status & 4 )) -eq 4 ] && { commands; to; fix; the; filesystem; }
Kurze Erklärung:
$?
ist der Beendigungsstatus des letzten Befehls (e2fsck
in diesem Fall). Ich speichere es in einer separaten Variable, damit ich mehrere Tests damit machen kann. In diesem einfachen Beispiel, bei dem es nur einen Test gibt, ist dies nicht erforderlich, im Allgemeinen jedoch eine gute Praxis. Der zugrunde liegende Grund ist: nachdem diese Zeilen$status
noch den Exit-Status von enthaltene2fsck
und wiederverwendet werden können, während (das Neue)$?
nichts damit zu tun hate2fsck
.$(( ... ))
macht Shell-Arithmetik- wo
&
ist bitweise UND, - dann
[ ... -eq 4 ]
ist in der Tat dertest
Befehl zu überprüfen, ob das Ergebnis ist4
. - Wenn der Test erfolgreich ist, wird der
{ ... }
Block ausgeführt.
Es können Fehler nicht im Dateisystem selbst, sondern auf tieferen Ebenen auf dem Gerät auftreten. Ich denke, das ist nicht im Rahmen dieser Frage, aber um Sie in die richtige Richtung zu weisen, falls Sie es brauchen, sind dies nützliche Befehle (Hinweis sdX
, nicht sdXX
):
smartctl -t long /dev/sdX
badblocks -n -b 512 /dev/sdX
Lesen Sie die Manpages, bevor Sie sie verwenden.