Получить список открытых файлов (дескрипторов) в OS X

Я хотел бы получить список открытых файлов в процессе на os x (10.9.1). В Linux я смог получить это от /proc/PID/fd. Однако я не уверен, как получить то же самое в OS X. Я обнаружил, что procfs отсутствует в OS X (по умолчанию присутствуют возможные реализации, но я не хочу идти по этому пути).

Итак, как мне получить (изначально) список открытых файлов в процессе на OS X. Один из способов - lsof. есть ли другая поддержка? пожалуйста, дайте мне знать, где я могу получить больше информации об этом.

Спасибо.


person user3169543    schedule 07.01.2014    source источник
comment
lsof - это предполагаемый ответ на вопрос в самом заголовке. Не могли бы вы сделать название более конкретным?   -  person benc    schedule 17.05.2017


Ответы (9)


По крайней мере, в OSX 10.10 (Yosemite, не проверял Mavericks) вы можете получить список открытых файлов по процессу через приложение мониторинга активности по умолчанию. Просто дважды щелкните соответствующий процесс в списке и выберите вкладку «Открыть файлы и порты» во всплывающем окне.

Совет: сочетание клавиш cmd+f на этой панели позволяет искать и выделять содержимое.

person Fuu    schedule 11.11.2014
comment
Он работает только для тех процессов, которыми вы владеете. Для всех остальных вам все равно нужно использовать lsof. - person Sija; 25.09.2018
comment
В Big Sur, по крайней мере, в Activity Monitor есть пункт меню Вид -> Все процессы, которые вроде бы работают. Мой пользователь является локальным администратором на Mac. - person Friedrich 'Fred' Clausen; 17.03.2021

Мне было трудно заставить Activity Monitor отображать открытые файлы для процесса, запущенного с правами root (через sudo). В исходном вопросе упоминается lsof, и он точно делает свое дело. Если вы знаете имя процесса или PID, это очень быстро.

Найти процессы по имени:

lsof -c processname

Найти процессы по PID:

lsof -p 123

(При необходимости добавьте префикс sudo, например, если вы не являетесь владельцем процесса.)

person smitelli    schedule 02.08.2016

Это работает для некоторых вещей:

sudo fs_usage | grep dev

для файлов /dev/ или подобных.

person eulerworks    schedule 05.12.2015

Чистый и простой подход к проверке текущего процесса (т.е. аналог /proc/self/fd в Linux) использовать ls /dev/fd/:

например

$ touch "file"
$ exec 3<>file

$ ls /dev/fd/    

0 1 2 3
person Travis Clarke    schedule 27.02.2017
comment
Есть ли способ получить доступ к этому для процесса, отличного от текущего? - person Charles Duffy; 06.03.2017
comment
@CharlesDuffy - я точно не уверен; Я переформулировал свой ответ. - person Travis Clarke; 06.03.2017

Список открытых файлов в /Volumes/VolumeName:

lsof | grep "/Volumes/VolumeName"
person Dmitry    schedule 23.05.2018
comment
А точнее: lsof "/Volumes/VolumeName" - person Thomas Tempelmann; 01.05.2020
comment
Вы можете фильтровать по pid, используя lsof -p pid, или отрицать этот pid, передавая -p ^pid и получая все, кроме тех, которые открыты pid. - person zevarito; 04.07.2020

Поскольку вы спросили «Есть ли какая-либо другая поддержка [кроме lsof]?», попробуйте следующее:

Создайте инструмент командной строки, используя C API "proc_pidinfo", указанный в выбранном ответе на этот вопрос: Как я могу программно получить список дескрипторов открытых файлов для заданного PID в OS X?

Вы можете использовать proc_pidinfo с опцией PROC_PIDLISTFDS для перечисления файлов, используемых данным процессом. Затем вы можете использовать proc_pidfdinfo для каждого файла по очереди с опцией PROC_PIDFDVNODEPATHINFO, чтобы получить его путь.

person Mike C.    schedule 07.10.2017

Я использую приложение What's Open, которое очень удобно (с фильтрами, выбором диска и т. д.).

Вы можете найти его здесь: http://whatsopen.en.softonic.com/mac.

person Laurent Lasudry    schedule 08.01.2014

Вы можете получить список открытых файлов по процессам через приложение мониторинга активности по умолчанию. Просто дважды щелкните соответствующий процесс в списке и выберите вкладку «Открыть файлы и порты» во всплывающем окне. Но вам было трудно заставить Activity Monitor отображать открытые файлы для процесса, работающего от имени пользователя root (через sudo) или другого пользователя.

Так что просто запустите Active Monitor по sudo, вот и все

sudo /Applications/Utilities/Activity\ Monitor.app/Contents/MacOS/Activity\ Monitor
person maximser    schedule 20.07.2020

lsof -c /^74016$/ -d^txt -FcfadDtns0

-F инструктирует lsof производить выходные данные, пригодные для использования другим процессом, таким как Perl или awk. В man lsof найдите OUTPUT FOR OTHER PROGRAMS для получения подробной информации. Символы, идущие после -F, представляют собой поле, которое вы хотите выбрать для вывода. Затем вывод помещает каждый из этих символов перед соответствующим полем. Пример вывода:

p212^@cloginwindow^@
fcwd^@a ^@tDIR^@D0x1000004^@s704^@n/^@
f0^@ar^@tCHR^@D0xf218cacb^@n/dev/null^@
f1^@au^@tCHR^@D0xf218cacb^@n/dev/null^@
f2^@au^@tCHR^@D0xf218cacb^@n/dev/null^@
f3^@ar^@tREG^@D0x1000004^@s216424^@n/Library/Application Support/CrashReporter/SubmitDiagInfo.domains^@
f4^@ar^@tREG^@D0x1000004^@s77^@n/private/etc/security/audit_user^@
f5^@ar^@tREG^@D0x1000004^@s652^@n/private/etc/security/audit_class^@
f6^@ar^@tREG^@D0x1000004^@s358^@n/private/etc/security/audit_control^@
f7^@ar^@tREG^@D0x1000004^@s111033^@n/System/Library/Frameworks/CoreImage.framework/Versions/A/Resources/ci_stdlib.metallib^@
f8^@au^@tIPv4^@d0xc401abd77f1dd1d9^@n*:*^@
f9^@ar^@tREG^@D0x1000004^@s308316^@n/System/Library/Frameworks/CoreImage.framework/Versions/A/Resources/ci_filters.metallib^@
f10^@au^@tREG^@D0x1000004^@s1536^@n/private/var/folders/4g/3lkhwv6n7_76_1s8snscvhxc0000gp/C/com.apple.loginwindow/com.apple.metal/3902/libraries.maps^@
f11^@au^@tREG^@D0x1000004^@s65536^@n/private/var/folders/4g/3lkhwv6n7_76_1s8snscvhxc0000gp/C/com.apple.loginwindow/com.apple.metal/3902/libraries.data^@
f12^@au^@tREG^@D0x1000004^@s1536^@n/private/var/folders/4g/3lkhwv6n7_76_1s8snscvhxc0000gp/C/com.apple.loginwindow/com.apple.metal/Intel(R) HD Graphics 630/functions.maps^@
f13^@au^@tREG^@D0x1000004^@s131072^@n/private/var/folders/4g/3lkhwv6n7_76_1s8snscvhxc0000gp/C/com.apple.loginwindow/com.apple.metal/Intel(R) HD Graphics 630/functions.data^@
p421^@ccoreauthd^@
fcwd^@a ^@tDIR^@D0x1000004^@s704^@n/^@
f0^@ar^@tCHR^@D0xf218cacb^@n/dev/null^@
f1^@au^@tCHR^@D0xf218cacb^@n/dev/null^@
f2^@au^@tCHR^@D0xf218cacb^@n/dev/null^@
p537^@cUserEventAgent^@
fcwd^@a ^@tDIR^@D0x1000004^@s704^@n/^@
f0^@ar^@tCHR^@D0xf218cacb^@n/dev/null^@
f1^@au^@tCHR^@D0xf218cacb^@n/dev/null^@
f2^@au^@tCHR^@D0xf218cacb^@n/dev/null^@
f3^@au^@tunix^@d0xc401abd77b9c8579^@n->0xc401abd77b9c8709^@
f4^@au^@tunix^@d0xc401abd77b9c7129^@n->0xc401abd77b9c8899^@
person Jose Quijada    schedule 11.03.2021