Команда 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 для обоих. Это не текущая активность и не доказательство отсутствия ожидающих записей на томе.
Как узнать, что блокирует ваш диск
Конкретно для проблем с извлечением вам обычно нужно лишь знать, какие имена процессов появляются. Частые виновники: 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 -a -c mds /Volumes/YourDriveName
Это показывает только процессы, имена которых начинаются с «mds».
Флаг +D рекурсивно перечисляет все открытые файлы в каталоге:
lsof +D /Volumes/YourDriveName
Это тщательнее, чем базовый синтаксис, но может быть медленным на больших дисках с множеством файлов.
Чтобы увидеть, какие процессы конкретного пользователя держат файлы открытыми на диске:
lsof -a -u yourusername /Volumes/YourDriveName
Использование lsof без sudo
По умолчанию lsof показывает только процессы, принадлежащие вашей учётной записи. Системные процессы, запущенные root (вроде mds от Spotlight), не появятся, если вы не запустите lsof с sudo:
sudo lsof /Volumes/YourDriveName
Вам нужно будет ввести пароль. Для устранения проблем с извлечением использование sudo почти всегда необходимо, поскольку блокировщиками часто оказываются именно системные процессы.
Завершение блокирующего процесса
Сохраните работу, завершите копирование и резервное копирование и закройте приложения обычным способом перед повторным извлечением. Принудительное завершение или извлечение может привести к потере данных; Ejecta не подтверждает безопасность записи.
kill 1234
Замените 1234 реальным PID. Если это не сработает, можно сделать это принудительно:
kill -9 1234
Имена процессов Spotlight не доказывают доступ только для чтения. Не завершайте mds или mds_stores принудительно ради освобождения диска. Подождите, закройте приложения и повторите обычное извлечение. Ejecta определяет эти процессы, но не предлагает обычное завершение системных процессов. Если диск остаётся заблокированным, сохраните всё и полностью выключите Mac перед отключением диска.
Для приложений, которыми владеете вы (например, окно Терминала с оболочкой, находящейся в каталоге диска), чище просто закрыть приложение обычным способом или уйти из каталога диска перед попыткой извлечения.
Частые сценарии
Терминал с текущим каталогом на диске: если вы перешли (cd) в папку на внешнем диске, этот процесс оболочки будет удерживать диск открытым. Либо перейдите куда-то ещё (cd ~), либо закройте это окно Терминала.
Окна Finder: если у Finder открыто окно с диском или даже если диск выбран на боковой панели, это может мешать извлечению. Закройте любые окна Finder, показывающие содержимое диска.
Имена процессов Spotlight не доказывают доступ только для чтения. Не завершайте mds или mds_stores принудительно ради освобождения диска. Подождите, закройте приложения и повторите обычное извлечение. Ejecta определяет эти процессы, но не предлагает обычное завершение системных процессов. Если диск остаётся заблокированным, сохраните всё и полностью выключите Mac перед отключением диска.
Фоновые приложения с открытыми файлами: некоторые приложения держат ссылки на недавние файлы даже после того, как вы закрыли документы. Творческие приложения вроде Photoshop или видеоредакторов — частые нарушители. Полное завершение приложения обычно освобождает файлы.
За пределами командной строки
Если вам некомфортно с Терминалом или вы не хотите разбирать вывод lsof каждый раз, когда нужно отключить диск, есть графические варианты.
Мониторинг системы может показать открытые файлы для конкретного процесса, но вам нужно уже знать, какой процесс проверять. Он не отвечает с лёгкостью на вопрос «что использует этот диск?».
Ejecta: Ejecta предлагает бесплатную диагностику дисков без ограничения пробного периода. Платная лицензия открывает завершение и извлечение для поддерживаемых приложений, извлечение всех дисков и управление Time Machine. Системные процессы могут требовать ожидания, авторизации или выключения. Сначала сохраните работу и завершите передачу.
Командная строка мощна для тех, кто её предпочитает, но она не должна быть обязательной для чего-то столь простого, как отключение диска.
Ejecta предлагает бесплатную диагностику дисков без ограничения пробного периода. Платная лицензия открывает завершение и извлечение для поддерживаемых приложений, извлечение всех дисков и управление Time Machine. Системные процессы могут требовать ожидания, авторизации или выключения. Сначала сохраните работу и завершите передачу.
Купить -Похожие статьи
diskutil eject: как извлекать диски из Терминала на Mac
Извлеките любой диск на Mac из Терминала с помощью diskutil — включая принудительное размонтирование тома, …
Как безопасно извлекать внешние диски в macOS Sequoia и Sonoma
Apple изменила то, как работает извлечение дисков в последних версиях macOS. Разбираемся, что нового в Sequoia …
Как исправить ошибку «Диск извлечён неправильно» на Mac
Предупреждение «Диск извлечён неправильно» означает, что какой-то процесс захватил диск до размонтирования. …
APFS или exFAT: какой формат выбрать для внешнего диска на Mac
Выбор файловой системы для внешнего диска влияет на всё — от производительности до сохранности данных. …