Команда lsof: объяснение для пользователей Mac

Освойте команду lsof, чтобы узнавать, какие процессы держат файлы открытыми на вашем Mac. Руководство для разработчиков и продвинутых пользователей.

Внешний диск не извлекается. macOS выдаёт до безумия расплывчатое сообщение, что «одна или несколько программ могут его использовать». Какие программы? Не скажет. Вот тут на сцену выходит lsof.

Название расшифровывается как «list open files» (список открытых файлов), и команда делает именно это. В Unix-системах вроде macOS почти всё трактуется как файл, включая сетевые подключения, устройства и дисковые тома. Когда вы не можете извлечь диск, lsof точно говорит вам, какой процесс держит его в заложниках.

Базовый синтаксис

Самый простой способ использовать lsof при проблемах с извлечением:

lsof /Volumes/YourDriveName

Замените «YourDriveName» реальным именем вашего диска. Если в имени есть пробелы, заключите весь путь в кавычки:

lsof "/Volumes/My Backup Drive"

Это возвращает список каждого процесса, у которого есть открытый файловый дескриптор на этом томе. Каждая строка показывает имя процесса, его идентификатор (PID), пользователя, который его запустил, и информацию о конкретном файле, к которому идёт обращение.

Чтение вывода

Типичный вывод lsof выглядит примерно так:

COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mds_store  1234   root   4r   REG   1,12   524288  ...  /Volumes/External/.Spotlight-V100/...
Finder     5678   you    3r   DIR   1,12     1024  ...  /Volumes/External

Самые важные столбцы — COMMAND (имя процесса), PID (идентификатор процесса, который вы используете для его завершения) и NAME (фактический путь к файлу, к которому идёт обращение).

Столбец FD показывает, как используется файл. Число с «r» означает доступ на чтение, «w» — на запись, а «u» — и чтение, и запись. Если вы видите «cwd», у процесса это расположение является текущим рабочим каталогом. Так бывает, когда у вас открыто окно Терминала в папке на диске.

Как узнать, что блокирует ваш диск

Конкретно для проблем с извлечением вам обычно нужно лишь знать, какие имена процессов появляются. Частые виновники: mds и mds_stores (индексирование Spotlight), Finder, QuickLookUIService (генерация миниатюр) и fsevents (наблюдатель файловой системы).

Если вывода много и вы хотите его сузить, используйте grep:

lsof /Volumes/YourDriveName | grep -v "^COMMAND"

Это убирает строку заголовка, чтобы вы видели только реальные процессы. Если вам нужны только уникальные имена процессов:

lsof /Volumes/YourDriveName | awk '{print $1}' | sort -u

Полезные флаги

Флаг -c фильтрует по имени команды. Если вы подозреваете, что проблема в Spotlight:

lsof -c mds /Volumes/YourDriveName

Это показывает только процессы, имена которых начинаются с «mds».

Флаг +D рекурсивно перечисляет все открытые файлы в каталоге:

lsof +D /Volumes/YourDriveName

Это тщательнее, чем базовый синтаксис, но может быть медленным на больших дисках с множеством файлов.

Чтобы увидеть, какие процессы конкретного пользователя держат файлы открытыми на диске:

lsof -u yourusername /Volumes/YourDriveName

Использование lsof без sudo

По умолчанию lsof показывает только процессы, принадлежащие вашей учётной записи. Системные процессы, запущенные root (вроде mds от Spotlight), не появятся, если вы не запустите lsof с sudo:

sudo lsof /Volumes/YourDriveName

Вам нужно будет ввести пароль. Для устранения проблем с извлечением использование sudo почти всегда необходимо, поскольку блокировщиками часто оказываются именно системные процессы.

Завершение блокирующего процесса

Узнав идентификатор процесса (PID) из вывода lsof, вы можете завершить его:

kill 1234

Замените 1234 реальным PID. Если это не сработает, можно сделать это принудительно:

kill -9 1234

Будьте с этим осторожны. Завершение системных процессов вроде mds может вызвать временные сбои. Процесс обычно перезапустится автоматически, но вы можете заметить, что Spotlight странно ведёт себя минуту. Завершать приложения вроде Finder в целом безопасно: macOS перезапустит Finder автоматически.

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

Частые сценарии

Терминал с текущим каталогом на диске: если вы перешли (cd) в папку на внешнем диске, этот процесс оболочки будет удерживать диск открытым. Либо перейдите куда-то ещё (cd ~), либо закройте это окно Терминала.

Окна Finder: если у Finder открыто окно с диском или даже если диск выбран на боковой панели, это может мешать извлечению. Закройте любые окна Finder, показывающие содержимое диска.

Индексирование Spotlight: процессы mds, mds_stores и mdworker индексируют новые диски автоматически. Вы можете дождаться их завершения, отключить индексирование командой sudo mdutil -i off /Volumes/YourDriveName или завершить их напрямую.

Фоновые приложения с открытыми файлами: некоторые приложения держат ссылки на недавние файлы даже после того, как вы закрыли документы. Творческие приложения вроде Photoshop или видеоредакторов — частые нарушители. Полное завершение приложения обычно освобождает файлы.

За пределами командной строки

Если вам некомфортно с Терминалом или вы не хотите разбирать вывод lsof каждый раз, когда нужно отключить диск, есть графические варианты.

Мониторинг системы может показать открытые файлы для конкретного процесса, но вам нужно уже знать, какой процесс проверять. Он не отвечает с лёгкостью на вопрос «что использует этот диск?».

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

Командная строка мощна для тех, кто её предпочитает, но она не должна быть обязательной для чего-то столь простого, как отключение диска.

Если вам не хочется каждый раз обращаться к Терминалу, Ejecta точно покажет, какой процесс блокирует ваш диск, — и позволит завершить его одним кликом прямо из строки меню.

Купить — $9.99