lsof -p PID проти lsof | греп ПІД


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 в будь-якому місці їх повного шляху.

EDIT: У вашому конкретному прикладі різниця полягає в тому, що lsofігнорувати файли, відкриті потоком. Якщо ви подивитеся на результат у grepприкладі, третім стовпцем є "TID" або Ідентифікатор теми. Рядки без TID відповідають тому, що ви бачили, коли використовували цю -pопцію. Лінії з TID (тобто рядки, відкриті іншими потоками) - це додаткові.


Насправді TID називається на головних сторінках як "Ідентифікаційний номер завдання", не обов'язково ідентифікатор теми.
Мільєн Мікіч

2

lsof - перерахуйте відкриті файли, спробуйте прочитати man-сторінку для 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

Я спробував це в своїй системі, і обидві команди генерують однакові списки, я пропоную вам спробувати обидві команди послідовно кілька разів, просто щоб переконатися, що стан процесу стабільний. Згідно з довідковою сторінкою та вашими результатами, це єдине пояснення, яке я можу мати.


0

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.