Что делать, если файл занят или используется

ActivityMonitorПри открытии файла той или иной программой, доступ к нему временно блокируется. Обычно блокировка длится лишь до тех пор, пока содержимое файла не будет прочитано и перенесено в оперативную память, что как правило не занимает много времени, а после этого доступ к файлу может получить любое другое приложение или сервис, чтобы сработать по той же самой схеме «заблокировать — прочитать — разблокировать». Однако, бывают случаи, когда программа сохраняет блокировку даже после прочтения файла. Такое может произойти как по ошибке, так и из-за специфики работы самой программы. В любом случае, дальнейшее взаимодействие с этим файлом будет невозможно, а попытки его редактировать, удалить, перенести или открыть в другой программе будут приводить к возникновению различных сообщений о том, что искомый файл заблокирован, недоступен, используется или даже, что у вас недостаточно прав для доступа к нему.

 

Самый простой способ решить эту проблему — завершить работу приложения, которое препятствует дальнейшему взаимодействию с файлом. Но вычислить, что именно это за программа, может быть довольно непросто, ведь «виновным» может оказаться и какой-нибудь фоновый процесс. Справиться с этой задачей можно при помощи Терминала.

Команда «lsof» выводит на экран список всех файлов, которые на данный момент открыты в той или иной программе. Поскольку список может быть довольно длинным, а нам нужна информация только по одному файлу, можно применить фильтр по его имени. Для этого запустите Терминал из папки «Утилиты» и введите команду lsof | grep filename где filename — имя искомого файла.lsofmyfile

В качестве альтернативы можно воспользоваться скриптом «fuser» входящим в состав OS X. Этот скрипт, также использует команду «lsof», но его вывод более прост для восприятия. Скрипт проверяет, используется ли в данный момент указанный вами файл, и, если используется, то каким именно процессом.

Запустите Терминал из папки «Утилиты» и введите команду fuser /path/to/file где /path/to/file — полный путь к искомому файлу. Для того чтобы его ввести, достаточно просто перетащить нужный файл в окно Терминала.fusermyfile1

После того как нам стал известен ID процесса можно запустить Мониторинг ресурсов и определить, какой программе он соответствует (для упрощения поисков можно использовать сортировку по PID, нажав на заголовок соответствующей колонки). Если искомый ID присвоен пользовательской программе, а не какому-нибудь служебному сервису, в первую очередь стоит попробовать завершить её работу штатными средствами, через графический интерфейс. Если этого сделать не удается можно последовательно опробовать несколько вариантов, доступных в окне Мониторинга системы. Выделите нужный процесс и перейдите в меню Вид — Послать сигнал процессу. Затем выберите в ниспадающем меню один из сигналов, описанных ниже, и нажмите кнопку «Отправить». В качестве альтернативы вы, опять же, можете воспользоваться Терминалом.SendSignal

1. Разрыв подключения (SIGHUP)

Данный сигнал заставит процесс освободить используемые ресурсы. Обычно в результате программа просто обновляет свою конфигурацию и продолжает работать дальше. Чтобы послать такой сигнал при помощи Терминала, введите команду kill -1 PID где PID — ID процесса, который мы узнали ранее.

2. Завершить (SIGTERM) и Прервать (SIGINT)

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

Для завершения: kill PID или kill -15 PID

Для прерывания: kill -2 PID

3. Завершить принудительно (SIGKILL)

Если вы пытаетесь завершить программу, но ничего не происходит, вероятнее всего вы посылаете сигнал штатного завершения (SIGTERM) или прерывания (SIGINT) работы, а они в некоторых случаях могут быть проигнорированы. Чтобы это обойти вы можете попробовать принудительно завершить проблемное приложение при помощи сигнала «SIGKILL». Чтобы сделать это при помощи Терминала, введите команду: kill -9 PID

После того как проблемная программа будет закрыта, вы, вероятнее всего, сможете свободно взаимодействовать с искомым файлом и открывать его в любой программе по вашему выбору.

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

За оригинальный материал, послуживший основой при написании данной статьи, в очередной раз благодарим Кристофера Кесслера.

О Дмитрий Архипов

Специалист технической поддержки пользователей.
Метки , , , , , , . Закладка постоянная ссылка.