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

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

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

решение1

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

sudo lsof /

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

Еще примеры:

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

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

решение2

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

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

решение3

Вот что я сделал и что мне идеально подошло:

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

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

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

  • /dev
  • /проц
  • /сис

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

решение4

Если вы используете lsof /его, он просто перечислит открытые файлы в файловых системах, смонтированных НЕПОСРЕДСТВЕННО в / - то есть, если у вас /home смонтирован в /, его содержимое будет проигнорировано. Я пробовал различные комбинации опций для lsof, но все они имели проблемы. Лучшее, что я смог придумать, это:

lsof `readlink -f /dev/block/*`

Здесь используется readlink -f для получения всех блочных устройств и предоставления их в виде списка для поиска. lsof игнорирует те, которые не смонтированы.

Если у вас есть другие варианты ограничения поиска, например pid, не забудьте завершить команду lsof оператором -aAND со списком блочных устройств:

lsof -p 982482 -a `readlink -f /dev/block/*`

Связанный контент