lsof -p PID vs lsof | grep PID

12

Ich verstehe die Ausgabe des Befehls lsof nicht.

Wenn ich schreibe

lsof -p PID

Ich bekomme 4 Zeilen und wenn ich schreibe

lsof | grep PID

Ich bekomme Hunderte von Zeilen.

Sollte es nicht dasselbe Ergebnis liefern?

Vielen Dank für Ihre Antworten. Hier werden ausgegeben. Sieht aus, als wäre es ein Unterprozess oder was bedeuten diese Aufgaben?

lsof -p 29076
COMMAND   PID  USER   FD      TYPE DEVICE SIZE/OFF NODE NAME
java    29076  pr    cwd   unknown                      /proc/29076/cwd (readlink: Permission denied)
java    29076  pr    rtd   unknown                      /proc/29076/root (readlink: Permission denied)
java    29076  pr    txt   unknown                      /proc/29076/exe (readlink: Permission denied)
java    29076  pr   NOFD                                /proc/29076/fd (opendir: Permission denied)

lsof |grep 29076|head -20
java      29076        pr  cwd   unknown                          /proc/29076/cwd (readlink: Permission denied)
java      29076        pr  rtd   unknown                          /proc/29076/root (readlink: Permission denied)
java      29076        pr  txt   unknown                          /proc/29076/exe (readlink: Permission denied)
java      29076        pr NOFD                                    /proc/29076/fd (opendir: Permission denied)
java      29076   300  pr  cwd   unknown                          /proc/29076/task/300/cwd (readlink: Permission denied)
java      29076   300  pr  rtd   unknown                          /proc/29076/task/300/root (readlink: Permission denied)
java      29076   300  pr  txt   unknown                          /proc/29076/task/300/exe (readlink: Permission denied)
java      29076   300  pr NOFD                                    /proc/29076/task/300/fd (opendir: Permission denied)
java      29076   329  pr  cwd   unknown                          /proc/29076/task/329/cwd (readlink: Permission denied)
java      29076   329  pr  rtd   unknown                          /proc/29076/task/329/root (readlink: Permission denied)
java      29076   329  pr  txt   unknown                          /proc/29076/task/329/exe (readlink: Permission denied)
java      29076   329  pr NOFD                                    /proc/29076/task/329/fd (opendir: Permission denied)
java      29076   330  pr  cwd   unknown                          /proc/29076/task/330/cwd (readlink: Permission denied)
java      29076   330  pr  rtd   unknown                          /proc/29076/task/330/root (readlink: Permission denied)
java      29076   330  pr  txt   unknown                          /proc/29076/task/330/exe (readlink: Permission denied)
java      29076   330  pr NOFD                                    /proc/29076/task/330/fd (opendir: Permission denied)
java      29076   331  pr  cwd   unknown                          /proc/29076/task/331/cwd (readlink: Permission denied)
java      29076   331  pr  rtd   unknown                          /proc/29076/task/331/root (readlink: Permission denied)
java      29076   331  pr  txt   unknown                          /proc/29076/task/331/exe (readlink: Permission denied)
java      29076   331  pr NOFD                                    /proc/29076/task/331/fd (opendir: Permission denied)
IL Stute
quelle

Antworten:

7

Ohne die tatsächliche Ausgabe zu sehen, ist es schwierig, genau zu sagen, was passiert, aber ich vermute, es liegt daran, dass der lsof -p PIDBefehl nur Dateien druckt, die mit der angegebenen PID geöffnet werden, während lsof | grep PIDZeilen mit der PID gedruckt werden befindet sich irgendwo in der Linie. Wenn Sie beispielsweise nach PID = 123 suchen, werden mit Ihrer grepOption auch Zeilen für die PIDs 1231, 1232, 1233 usw. sowie für alle Dateien gedruckt, die sich in Ordnern mit 123 an einer beliebigen Stelle im vollständigen Pfad befinden.

BEARBEITEN: In Ihrem speziellen Beispiel besteht der Unterschied darin, dass lsofvon einem Thread geöffnete Dateien ignoriert werden. Wenn Sie sich die Ausgabe im grepBeispiel ansehen, ist die dritte Spalte die 'TID' oder Thread-ID. Zeilen ohne TID stimmen mit dem überein, was Sie bei Verwendung der -pOption gesehen haben. Zeilen mit einer TID (dh Zeilen, die von anderen Threads geöffnet wurden) sind die Extras.

David King
quelle
Tatsächlich wird TID in Manpages als "Task IDentification Number" bezeichnet, nicht unbedingt als Thread ID.
Miljen Mikic
2

lsof - liste offene Dateien auf, versuche die Manpage für lsof zu lesen #man lsof

lsof -p PID Listet offene Dateien auf, die mit der Prozess-ID der PID verknüpft sind.

In Ermangelung von Optionen listet lsof alle offenen Dateien auf, die zu allen aktiven Prozessen gehören. Wenn Sie dies tun lsof | grep PID, werden alle offenen Dateien aufgelistet, die zu allen aktiven Prozessen gehören, und es wird die PID-Nummer abgefragt, die mit der PID selbst und auch überall dort übereinstimmen kann, wo die PID als Teil anderer PIDs erscheint und möglicherweise auch der untergeordnete Prozess der PID ist bald.

Wenn Sie also verwenden möchten, lsof | grep PIDsollten Sie die PID genau abgleichen, wie eine vollständige lsof | grep -w PIDWortübereinstimmung. Wenn PID andere untergeordnete Prozesse hat, werden jedoch immer noch mehr Zeilen angezeigt.

Ijaz Ahmad Khan
quelle
0

Ich habe dies auf meinem System versucht und beide Befehle generieren die gleichen Listen. Ich schlage vor, Sie versuchen beide Befehle mehrmals hintereinander, um sicherzustellen, dass der Status des Prozesses stabil ist. Laut der Manpage und Ihren Ausgaben ist dies die einzige Erklärung, die ich haben kann.

user148564
quelle