Как мне сообщить 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 оператором -a
AND со списком блочных устройств:
lsof -p 982482 -a `readlink -f /dev/block/*`