Warum grep hängen, wenn gegen die / - Verzeichnis?
Meine Frage ist in zwei Teile gegliedert :
1) Warum grep hängen, wenn ich mit grep alle Dateien unter "/" ?
Beispiel :
grep -r 'h' ./
(Hinweis : direkt vor der hängen/Absturz, Stelle ich fest, dass ich einige "kein solches Gerät oder Adresse" Nachrichten über sockets....
Natürlich weiß ich, dass grep sollte nicht laufen, gegen einen sockel, aber ich würde denken, dass da sockets sind nur Dateien in Unix, sollte es wieder zu einem negativen Ergebnis führt, anstatt abzustürzen.
2) Nun, meine follow-up Frage : In jedem Fall-wie kann ich grep das ganze Dateisystem? Gibt es bestimmte *NIX Verzeichnisse, die sollten wir weglassen, wenn dies zu tun ? Insbesondere interessiere ich mich für alle zuletzt geschriebenen log-Dateien.
- grep nicht hängen, Ihr -r bedeutet rekursiv Alle Dateien auf dem system. Wie viele Gigabyte ist das? Auch alle NFS eingebundenen Dateien verarbeitet werden auf Netzwerk-Verbindungsgeschwindigkeit, die nicht als lokale Datei auf einem Datenträger direkt an die CPU. Das wird eine lange Zeit dauern. Viel Glück.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als @ninjalj sagte, wenn Sie nicht
-D skip
,grep
werden versuchen, Lesen Sie alle Ihre Geräte-Dateien, socket-Dateien, FIFO-Dateien. Insbesondere auf einem Linux-system (und viele Unix-Systeme), wird es versuchen zu Lesen/dev/zero
, das scheint unendlich lange.Werden Sie warten eine Weile.
Wenn Sie sich für ein system-log, ab
/var/log
ist wahrscheinlich der beste Ansatz.Wenn Sie auf der Suche nach etwas, das wirklich überall sein könnte in Ihrem Dateisystem können Sie etwas wie das hier tun:
Den
-xdev
argumentfind
sagt er zu bleiben, in einem einzigen Dateisystem; dadurch wird vermieden/proc
und/dev
(wie auch alle gemounteten Dateisysteme).-type f
schränkt die Suche auf normale Dateien.-print0
druckt die Datei-Namen getrennt durch ein null-Zeichen statt Zeilenschaltungen; dies vermeidet Probleme mit Dateien mit Leerzeichen oder andere komische Zeichen in Ihrem Namen.xargs
liest eine Liste von Dateinamen (oder etwas anderes) auf seine standard-Eingabe und ruft den angegebenen Befehl auf alles in der Liste. Die-0
option funktioniert mitfind
's-print0
.Den
-H
optiongrep
sagt Ihr das Präfix jedes Spiel mit dem Datei-Namen. Standardmäßiggrep
tut dies nur, wenn es zwei oder mehrere Dateinamen auf der Kommando-Zeile. Daxargs
teilt seine Argumente in den Reihen, ist es möglich, dass der Letzte Stapel nur eine Datei, die Ihnen die Ergebnisse uneinheitlich.Erwägen Sie die Verwendung
find ... -name '*.log'
beschränken die Suche auf Dateien mit Namen, die Endung.log
(vorausgesetzt, Ihre log-Dateien haben Namen), und/oder mitgrep -I ...
zu überspringen binäre Dateien.Beachten Sie, dass alles hängt davon ab, GNU-spezifische Funktionen. Einige dieser Optionen möglicherweise nicht verfügbar auf MacOS (basiert auf BSD) oder auf anderen Unix-Systemen. Konsultieren Sie Ihre lokale Dokumentation, und erwägen Sie die Installation von GNU findutils (für
find
undxargs
) und/oder GNU grep.Bevor Sie versuchen, eines dieser, verwenden Sie
df
zu sehen, wie groß Ihr root-Dateisystem ist. Mir ist derzeit 268 gigabytes, Suche alle es würde wohl mehrere Stunden dauern. Ein paar Minuten verbrachte (a) die Einschränkung der Dateien, die Sie suchen, und (b) sicherstellen, dass der Befehl korrekt ist, wird gut sein, lohnt die Zeit, die Sie verbringen.find / -xdev -type f -exec grep -H {} +
.Standardmäßig
grep
zu Lesen versucht jede Datei. Verwenden-D skip
zu überspringen-Gerät-Dateien, socket-Dateien, FIFO-Dateien.Wenn Sie sehen immer Fehlermeldungen, dann
grep
nicht hängen. Halteniotop
öffnen in einem zweiten Fenster, um zu sehen, wie schwer Ihr system arbeitet zu ziehen alle der Inhalt aus dem Speichermedium in den Hauptspeicher laden, Stück für Stück. Dieser Vorgang sollte langsam sein, oder Sie haben eine sehr Barebone-system.Grepping die ganze FS ist sehr selten eine gute Idee. Versuchen grepping das Verzeichnis in dem die log-Dateien geschrieben werden sollte; wahrscheinlich
/var/log
. Noch besser, wenn Sie wissen nichts über die Namen der Dateien, die Sie suchen (sagen, Sie haben die Erweiterung.log
), dann machen Sie einefind
oderlocate
undgrep
die Dateien gemeldet, die von diesen Programmen.