Als ordentliche Systemadministratoren möchten wir sicherstellen, dass die kleinen Dinge genauso gut abgedeckt sind wie die großen (wenn es die Zeit erlaubt). Eines dieser Dinge ist sicherzustellen, dass unsere Systeme nicht voll von defekten Symlinks sind.
Warum sind diese kleinen Fäulnisse ein Problem? Weil sie dich denken lassen, dass Dateien da sind, wenn sie nicht da sind, können sie ein Hinweis auf etwas ärgerlicheres sein, und weil der (kleine) OCD-Teil von mir mit all diesen Warnungen verrückt wird, wenn bestimmte Befehle ausgeführt werden (wie grep -r
).
Wie würde man also vorgehen, um defekte Links in den Teilen eines Systems, für die der Administrator verantwortlich ist, zu erkennen (und per E-Mail oder Überwachungssystem zu melden) (es macht keinen Sinn, mir zu sagen, dass ~jbloggs
es eine Reihe defekter Symlinks gibt, das ist sein Problem )?
quelle
Antworten:
Das Problem dabei
-L
ist, dass dies den Nebeneffekt hat, dass die Suche in Unterverzeichnisse erweitert wird, deren Ziel Ziele sindsymlinks
, die möglicherweise nicht erwartet oder gewünscht werden.Mit
GNU findutils
Version vonfind
:außer dass keine zyklischen symbolischen Links gefunden werden.
-execdir
in der anderen Antwort ist es nicht so portabel, also destillieren Sie es auf eine tragbare Lösung, die defekte symbolische Links findet, einschließlich zyklischer Links:Weitere Informationen finden Sie in dieser Frage oder auf ynform.org . Siehe auch die findutils Dokumentation für weitere Einzelheiten. Der Link ynform.org bietet auch eine Methode zum Erkennen nur zyklischer Links.
quelle
Viele Möglichkeiten, eine Katze zu häuten
Dies ist ziemlich portabel (-L ist Posix-Anforderung)
Sie haben defekt nicht definiert. Das oben Gesagte würde Ihnen defekte Links senden, die kein Ziel in dem Teil des Dateisystems haben, den Sie interessieren. Es werden auch stderr-Dateisystemschleifen und zu viele Ebenen symbolischer Verknüpfungen usw. gemeldet. Wenn Sie sich auch für sie interessieren, leiten Sie stderr an Ihre E-Mail weiter
Wenn Ihr Fund dies unterstützt,
-readable
ist er nützlich und schnellDas Obige enthält Links mit zu vielen Ebenen symbolischer Linkprobleme in der Ausgabe, jedoch keine Dateisystemschleifen.
Wenn die Teile des Dateisystems, die Sie interessieren, unterschiedliche Pfade haben
quelle
find -L
ist für diesen Anwendungsfall problematisch. Siehe: unix.stackexchange.com/a/38691/6860Ich werde Ihnen eine Linux-Antwort geben und Sie können sie bei Bedarf an Ihr Unix anpassen:
find . -type l ! -execdir test -e {} \; -print >> broken_symlinks.txt; mutt -s "Broken symlinks" [email protected] < broken_symlinks.txt; rm -f broken_symlinks.txt
Die zweite Option ist
ls -LR | grep 'cannot access'
oder einige Änderungen aus dem obigen Befehl find.Bearbeiten:
Ja, das ist noch besser:
find . -type l ! -execdir test -e {} \; -print | mail -s "Broken symlinks" [email protected]
quelle
broken_symlinks.txt
ganz loswerden und einfach ein Rohr benutzen? Und verwenden,mail
anstattmutt
die E-Mail zu senden?Dies ist eine gute Möglichkeit, dies mit GNU find zu tun:
Der Grund dafür ist, dass
-lname
mit-follow
(oder -L) "... dieser Test false zurückgibt, es sei denn, der symbolische Link ist unterbrochen", so die Manpage find.Es wäre wahrscheinlich ratsam, diese Art des Festplatten-Scannens auszuführen, wenn der Server nicht stark ausgelastet ist. Es kann nützlich sein,
nice
und / oderionice
( eine schöne Beschreibung von ionice finden Sie in diesem Blog ) zu verwenden, um die Belastung des Servers während der Ausführung dieser Aufgabe zu verringern.quelle
Fedora und Ubuntu stellen das
symlinks
Dienstprogramm bereit . Das Dienstprogramm ist eine native ausführbare Elf-Datei und kein Wrapper-Shell-Skript. Das Dienstprogramm wurde auf Fedora vorinstalliert. Möglicherweise müssen Sie das Dienstprogramm unter Ubuntu installieren.Mit dem
symlinks
Dienstprogramm können Sie mit dem folgenden Befehl nach baumelnden Links suchen.Wenn die Ziele der baumelnden Links gelöscht werden können, geben Sie Folgendes aus, um sie zu löschen.
Hier ist ein Beispiel für die Ausgabe auf einem Fedora 31-Server. Die
debian-logo.png
undubuntu-logo.png
sind richtig.quelle