
Ich habe auf mehreren Plattformen das folgende Grep-Suchmuster verwendet:
grep -r -I -D skip 'string_to_match' /
Zum Beispiel aufFreeBSD 8.0,FreeBSD 6.4UndDebian 6.0(quetschen). Der Befehl führt eine rekursive Suche ausgehend vom Stammverzeichnis durch, geht davon aus, dass Binärdateien nicht über den „string_to_match“ verfügen und überspringt Geräte, Sockets und benannte Pipes.FreeBSD 8.0UndFreeBSD 6.4verwenden Sie GNU grep Version 2.5.1 undDebian 6.0verwendet GNU grep Version 2.6.3. AufFreeBSD 6.4, die letzte auf stderr ausgegebene Information war„grep: /dev/cuad0: Gerät beschäftigt“. Danach läuft grep einfach im Leerlauf, da laut "top -m io -o total" die I/O-Nutzung von grep nicht vorhanden ist. Dasselbe Verhalten gilt unterFreeBSD 8.0, aber die letzte an stderr gesendete Information ist„grep: /tmp/.wine-0: Zugriff verweigert“auf meiner Installation. Bei Debian ist die letzte Ausgabe auf stderr„grep: /proc/sysrq-trigger: Eingabe-/Ausgabefehler“. Wenn ich die E/A-Nutzung des Grep-Prozesses unter Debian überprüfe, ist das Folgende zu sehen:
root@Debian:~# iotop -bp 22439
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
22439 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % grep -r -I
-D skip 10.10.10.99 /
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
22439 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % grep -r -I
-D skip 10.10.10.99 /
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
22439 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % grep -r -I
-D skip 10.10.10.99 /
^Croot@Debian:~#
Was könnte dies verursachen? Gibt es eine Möglichkeit, anzuzeigen, welche Dateigrepwird derzeit bearbeitetlsofist nicht vorhanden? Ich kann verwendenlsofunter Debian und es sieht so aus, als ob der problematische Dateiname dort "0xc6b2c230 file struct, ty=0, op=0xc0d34120" ist. Ich bin mir nicht sicher, was das ist. Ich kann nicht verwendenlsofoderfstatunter FreeBSD.
PS: Ich weiß, ich könntefindenNutzen, aber das ist nicht die Frage.
Antwort1
Unter Linux können Sie statt lsof
den Inhalt von auflisten /proc/$(pgrep grep)/fd
. Sie sollten für jeden geöffneten Dateideskriptor für diesen Prozess einen symbolischen Link sehen, der auf die entsprechende Datei verweist. Hier ist ein Beispiel, was dies für mich bewirkt hat:
$ ls -gG /proc/$(pgrep grep)/fd
total 0
lrwx------ 1 64 Oct 18 19:39 0 -> /dev/pts/2
lrwx------ 1 64 Oct 18 19:39 1 -> /dev/pts/2
lrwx------ 1 64 Oct 18 19:39 2 -> /dev/pts/2
lr-x------ 1 64 Oct 18 19:39 3 -> /usr/share/groff/1.18.1.4/font/devdvi/generate/texb.map