lsof - ограничить вывод только физическими файлами - как?

30

Как мне сказать, нужно ли мне перечислять только физические файлы (не сокеты, не соединения TCP / IP, только физические файлы)?

Владислав Раструсный
источник
Сначала нужно определить, для чего это нужно. Сказать "физические файлы" - это слишком общее. lsof выдаст вам файлы, которые были открыты с помощью файлового дескриптора. это даст вам файлы, которые были открыты как отображенные в памяти файлы потоками. это даст вам файлы библиотеки, которые были открыты процессами. все это физические файлы, но способ их использования отличается.
Майкл Мартинес

Ответы:

37

Просто просмотрел несколько справочных страниц, похоже, вы используете команду:

sudo lsof /

Это перечислит все открытые файлы в каталоге /, который является всем в файловой системе Linux. Только что протестировал и показывает только REG и DIR.

Больше примеров:

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

0-999 ограничивает его файлами с номером дескриптора файла.

Дэйв Драгер
источник
2
Будет также включать FIFO.
Кайл Брандт
1
Красиво и просто. Если вам нужен только последний столбец, вы можете добавить | awk {'print $ 9'} Интересно. Я не получаю FIFO в моем выводе либо. Fedora 12 и CentOS 5.3
egorgry
CentOS 5.2 и Ubuntu 9.04 возвращают мне данные fifo, это может быть изменением, но вы уверены, что есть fifo? Я бы сначала попробовал и удостоверился, что он есть, а потом попробую/
Кайл Брандт
Кроме того, я просто придираюсь, кажется, он просто не хочет шума, и, вероятно, не будет очень много пятерки.
Кайл Брандт
4
lsof / включает только файлы в корневой файловой системе. Если у вас смонтировано несколько файловых систем, они не появятся в выводе. Я считаю, что лучший способ - просто использовать grep.
Джеймс
9

Возможно, есть переключатель, но если вы не против фильтровать его через grep, вы можете сделать это sudo lsof | egrep 'REG|DIR', предполагая, что под «физическими файлами» вы подразумеваете обычные файлы и каталоги.

См. Раздел OUTPUT :: TYPE страницы man lsofруководства для всех типов, которые могут быть в этом столбце.

Кайл Брандт
источник
24
Там может быть переключатель, но man-страница читается как чья-то кандидатская диссертация ... :)
Cawflands
1
Да ... Ибо человека чрезвычайно трудно читать ...; p)
Владислав Раструсный
+1 этот комментарий. :)
egorgry
на vpn-сервере с достаточным количеством клиентов lsof не вернется, поэтому greping для меня не вариант
Охад Коэн,
@OhadCohen lsof вернется, если вы ограничите то, что он ищет. См. «FD» на странице руководства (mem, cwd, pd и т. Д.)
Майкл Мартинес,
2

Это то, что я сделал, что отлично сработало для меня:

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

-F nОпция lsofзаставит его только распечатать имена из открытых файлов. Каждая выходная строка с именем открытого файла начинается с одного символа n, за которым сразу следует имя . Обычные файлы всегда будут абсолютным, полностью определенным именем файла. Команда grep ^n/будет выбирать только те строки, имя которых начинается с /(означает абсолютное полное имя файла); таким образом исключая такие вещи, как открытые порты, сокеты, канал (например, FIFO) и т. д. При cut -c2-этом удаляется первый символ n, оставляя только имя файла. Затем, наконец, sort -uбудут удалены любые повторяющиеся записи.

Одно предупреждение, это будет включать в себя файлы, которые не являются регулярными, если их имя начинается с /. Например, будут включены все файлы, начинающиеся со следующего:

  • / DEV
  • / Proc
  • / SYS

И могут быть другие в зависимости от вашей ОС.

Грег Барретт
источник