Посмотрите, какой процесс использует файл в Mac OS X

93

Я хотел бы иметь возможность отслеживать файл и видеть, какой процесс затрагивает этот файл. Это возможно? Я знаю, что могу видеть список открытых процессов в мониторе активности, но я думаю, что это происходит очень быстро, чтобы увидеть его. Причина этого в том, что я использую фреймворк, и я думаю, что вместо отладочной версии используется системная версия фреймворка, и я хотел бы увидеть, какой процесс затрагивает его.

JPC
источник
1
это вопрос использования лучше спросил на Super User
Michael Dautermann
ПРИМЕЧАНИЕ: ^^^ ЯВЛЯЕТСЯ ОЧЕНЬ УДОБНЫМ, аналогичный вопрос - к вашему сведению ;-)
Брэд Паркс,

Ответы:

90

lsof отобразит список открытых файлов, но это может быть немного неудобно для моментальных касаний (например, если файл не открыт при запуске lsof, он не отображается).

Думаю, вам лучше всего будет fseventer.app от fernLightning . Это «nagware», которое позволяет вам (графически) наблюдать за API fsevents в реальном времени.

Шон
источник
39
lsof | grep myfilenameработал у меня. У меня в корзине есть PDF-файл, который, по утверждению системы, уже используется. Странно lsofутверждает, что он используется, Previewно Preview, похоже, не работает (например, когда я использую command-tab в запущенных приложениях), но Activity Monitorпоказывает, что он работает. Глупый превью.
Дэйв Саг
Это идеально подходит для временных файлов (т. Е. Файлов, которые не открываются, а затрагиваются только во время сохранения).
Jeronimo Colon III
Сегодня у меня была аналогичная проблема с файлом в моей корзине, который хранится в процессе предварительного просмотра зомби. Открытие предварительного просмотра и повторный выход из него решили проблему для меня. Я думаю, что Preview регулярно хранит файлы, хотя он и вышел. Я часто открываю изображения из Evernote в режиме предварительного просмотра, чтобы обрезать их, и в большинстве случаев - чаще всего - даже после того, как я выхожу из предварительного просмотра, Evernote борется, что изображение все еще открыто в другом приложении.
Vihung
Это похоже на проблему, с которой я столкнулся прямо сейчас - решения пока нет. Я загрузил файл с помощью Chrome, а затем переместил его с помощью Finder в другую папку. Он оказался серым, поэтому я использовал lsof, чтобы узнать, у кого был открыт файл: Finder. Я попытался принудительно закрыть Finder (который автоматически перезапустил его). Это не сработало. Я попытался закрыть свой ноутбук, полагая, что это переведет все в спящий режим, и, надеюсь, решит проблему. Это тоже не сработало. lsof продолжает отображать Finder как виновника, и он продолжает отображаться серым цветом в пользовательском интерфейсе.
Виктор Энгель
1
Интересно, что закрытие окон поиска решило проблему. Однако, если я открыл новое окно поиска и перешел в ту же папку, проблема осталась. Я решил проблему, перетащив ошибочный файл в корзину (с предупреждением о возможных нежелательных эффектах в программе, в которой открыт этот файл), а затем повторно скопировал файл.
Виктор Энгель
95

Это просто: sudo fs_usage | grep [path_to_file]

spaceboy.cz
источник
10
Это, безусловно, лучший ответ здесь.
NuSkooler
fs_usage следует запускать как root ... это не лучшее решение.
bontoJR 01
Это показывает события фс? Если у процесса есть открытый файл, но он ничего не делает с ним, здесь ничего не отображается. Или, по крайней мере, так мне показалось. sudo fs_usage | grep musiclibraryничего не показал, но sudo lsof | grep musiclibraryпоказал 3 процесса, обращающихся к файлам базы данных моей музыкальной библиотеки.
gman
43

Но я потратил 2 минуты на поиск в Google и нашел здесь ваш ответ .

$ lsof | grep [что угодно]

Где [что угодно] заменяется именем файла, который вы ищете. Благодаря этому вы можете увидеть, какая программа отчаянно хранит ваш файл, который вот-вот будет удален. Как только вы выйдете из этой программы, ваша корзина станет пустой.

Михаэль Даутерманн
источник
1
Проблема в том, что мне нужно очень быстро набирать lsof. это может быть только временное
явление
13
lsof -r переводит lsof в режим повтора
stoutyhk 02
Имеет смысл использовать команду grep на случай, если файл был выпущен.
Ray Hunter
16

Более быстрый способ:

$ lsof [path_to_file]

Это решение не требует пароля root и возвращает следующий четкий результат:

COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
Finder     497  JR7   21r   REG    1,2   246223 33241712 image.jpg
QuickLook 1007  JR7  txt    REG    1,2   246223 33241712 image.jpg
bontoJR
источник
15

Другой вариант - Ленивец . Это бесплатный графический интерфейс с открытым исходным кодом для LSOF, о котором упоминали другие.

кавалькада
источник
1
Вау, это действительно отличный инструмент, спасибо, что поделились! Это сработало идеально для поиска процесса, который я потерял.
RayB
2
Я предпочитаю решения для командной строки, потому что они более портативны, но я должен признать, что это очень хороший инструмент! Спасибо за предложение.
Форма