lsof - Ausgabe nur auf physische Dateien beschränken - wie?

30

Wie erkläre ich, dass ich nur physische Dateien auflisten muss (keine Sockets, keine TCP / IP-Verbindungen, nur physische Dateien)?

Vladislav Rastrusny
quelle
Zuerst müssen Sie bestimmen, wofür Sie es benötigen. "Physische Dateien" zu sagen ist zu allgemein. lsof gibt Ihnen Dateien, die mit einem Dateideskriptor geöffnet wurden. Es werden Ihnen Dateien angezeigt, die von Threads als Speicherzuordnungsdateien geöffnet wurden. Es gibt Ihnen Bibliotheksdateien, die von Prozessen geöffnet wurden. Alle diese Dateien sind physische Dateien, aber die Art und Weise, wie sie verwendet werden, ist unterschiedlich.
Michael Martinez

Antworten:

37

Wenn Sie nur einige Manpages durchgesehen haben, erscheint es, als würden Sie den folgenden Befehl verwenden:

sudo lsof /

Dies listet alle offenen Dateien im Verzeichnis / auf, das alles auf einem Linux-Dateisystem ist. Gerade getestet und es werden nur REG und DIR angezeigt.

Mehr Beispiele:

lsof -a -d 0-999 -c <command name> /
lsof -a -d 0-999 -p <pid> /

0-999 beschränkt es auf Dateien mit einer Dateideskriptornummer.

Dave Drager
quelle
2
Wird auch FIFOs enthalten.
Kyle Brandt
1
Schön und einfach. Wenn Sie nur die letzte Spalte benötigen, können Sie | anhängen awk {'print $ 9'} Interessant. Ich bekomme auch kein FIFO in meiner Ausgabe. Fedora 12 und CentOS 5.3
egorgry
CentOS 5.2 und Ubuntu 9.04 geben die Fifos für mich zurück, könnte eine Änderung sein, aber sind Sie sicher, dass es Fifos gibt? Ich würde zuerst danach greifen und sicherstellen, dass es da ist, dann probiere es mit/
Kyle Brandt
Außerdem habe ich nur ein bisschen gepickt, es hört sich so an, als würde er den Lärm einfach nicht wollen, und es wird wahrscheinlich nicht sehr viele Fifos geben.
Kyle Brandt
4
lsof / enthält nur Dateien im Root-Dateisystem. Wenn Sie mehrere Dateisysteme gemountet haben, werden diese nicht in der Ausgabe angezeigt. Ich finde, der beste Weg ist, einfach grep zu verwenden.
James
9

Es mag einen Schalter geben, aber wenn Sie nichts dagegen haben, ihn durch grep zu filtern, können Sie dies tun sudo lsof | egrep 'REG|DIR', vorausgesetzt, mit "physischen Dateien" meinen Sie reguläre Dateien und Verzeichnisse.

Im Abschnitt OUTPUT :: TYPE der Manpage finden Sie man lsofalle Typen, die sich möglicherweise in dieser Spalte befinden.

Kyle Brandt
quelle
24
Es könnte einen Wechsel geben, aber die Manpage liest sich wie eine Doktorarbeit von jemandem ... :)
Cawflands
1
Ja ... der Mensch ist extrem schwer zu lesen ...; p)
Vladislav Rastrusny
+1 dieser Kommentar. :)
egorgry
auf einem VPN - Server mit genügend Kunden, wird lsof nicht zurück, so greping ist keine Option für mich
Ohad Cohen
@OhadCohen lsof kehrt zurück, wenn Sie die Suche einschränken. Siehe "FD" in der Manpage (mem, cwd, pd, etc)
Michael Martinez
2

Das habe ich gemacht, was für mich perfekt funktioniert hat:

lsof -F n -p 12501 | grep ^n/ | cut -c2- | sort -u

Mit der -F nOption lsofkönnen Sie festlegen, dass nur die Namen der geöffneten Dateien gedruckt werden . Jede Ausgabezeile, die den Namen einer geöffneten Datei enthält, beginnt mit dem einzelnen Zeichen n, unmittelbar gefolgt vom Namen . Reguläre Dateien sind immer der absolute, vollqualifizierte Name der Datei. Der grep ^n/Wille wählt nur die Zeilen mit einem Namen aus, der mit a beginnt /(was einen absoluten, voll qualifizierten Dateinamen bedeutet); Auf diese Weise werden offene Ports, Sockets, Pipes (wie FIFOs) usw. entfernt. Das cut -c2-erste Zeichen, das n, bleibt nur der Dateiname. Anschließend sort -uwerden alle doppelten Einträge entfernt.

Eine Einschränkung, dies schließt Dateien ein, die nicht regelmäßig sind , solange ihr Name mit a beginnt /. Beispielsweise wären alle Dateien enthalten, die mit den folgenden beginnen:

  • / dev
  • / proc
  • / sys

Abhängig von Ihrem Betriebssystem gibt es möglicherweise auch andere.

Greg Barrett
quelle