lsof -p PID против lsof | grep PID

12

Я не понимаю выход команды lsof.

Когда я пишу

lsof -p PID

Я получаю 4 строки и когда я пишу

lsof | grep PID

Я получаю сотни строк.

Разве это не должно вернуть тот же результат?

Спасибо за ваши ответы. Здесь вывод. Похоже, это субпроцесс или что означают эти задачи?

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)
Ил Маре
источник

Ответы:

7

Не видя фактического вывода, трудно сказать точно, что происходит, но я предполагаю, что это вызвано тем фактом, что lsof -p PIDкоманда просто распечатывает файлы, которые открыты указанным PID, в то время lsof | grep PIDкак печатает любые строки, где 'PID' находится в любом месте линии. Например, если вы ищете PID = 123, то ваш grepвариант также будет печатать строки для PID 1231, 1232, 1233 и т. Д., А также любые файлы, которые расположены в папках с 123 в любом месте на своем полном пути.

РЕДАКТИРОВАТЬ: в вашем конкретном примере разница в том, что lsofигнорирует файлы, открытые потоком. Если вы посмотрите на вывод в grepпримере, третий столбец - это «TID» или «ID потока» . Строки без TID соответствуют тому, что вы видели, когда использовали эту -pопцию. Строки с TID (т.е. строки, открытые другими потоками) являются дополнительными.

Дэвид Кинг
источник
На самом деле, TID в справочных страницах называется «Идентификационным номером задачи», а не обязательно идентификатором потока.
Мильен Микич
2

lsof - список открытых файлов, попробуйте прочитать справочную страницу для lsof #man lsof

lsof -p PID выводит список открытых файлов, связанных с идентификатором процесса PID.

При отсутствии каких-либо опций lsof выводит список всех открытых файлов, принадлежащих всем активным процессам. когда вы это сделаете lsof | grep PID, он перечисляет все открытые файлы, принадлежащие всем активным процессам, и подбирает номер PID, который может совпадать с самим PID, а также где угодно, где PID появляется как часть других PID и может также быть дочерним процессом PID, и скоро.

Поэтому, если вы хотите использовать его, lsof | grep PIDвам нужно точно подобрать PID, как полное совпадение слов lsof | grep -w PID, но это все равно приведет к большему количеству строк, если у PID есть другие дочерние процессы.

Иджаз Ахмад Хан
источник
0

Я попробовал это в моей системе, и обе команды генерируют одни и те же списки, я предлагаю вам попробовать обе команды последовательно несколько раз, просто чтобы убедиться, что состояние процесса стабильно. Согласно справочной странице и вашим выводам, это единственное объяснение, которое я могу получить.

user148564
источник
0

Некоторые версии lsof включают идентификатор потока. Это можно определить по заголовку столбца TID, который виден в выходных данных. Такой вывод приведет к дублированию записей, поскольку lsof потенциально покажет дублированные записи по одной для каждого потока.

https://support.datastax.com/hc/en-us/articles/209826153-lsof-shows-Cassandra-is-holding-a-large-amount-of-files-open

Владимир Ондрус
источник