При каких обстоятельствах системный процесс (PID 4) сохраняет дескриптор открытого файла?
Мое приложение, работающее на сервере Windows, использует базу данных Jet/Access. По некоторым причинам каждые две недели этот файл базы данных блокируется процессом System (PID 4, кажется, исправлен)
После некоторого поиска в Google я обнаружил, что некоторые другие пользователи блокировали свои файлы этим специальным процессом, но разные файлы (конечно).
- Какова общая причина того, что процесс System сохраняет дескриптор открытого файла?
- Является ли мое приложение причиной этой ситуации блокировки?
- Все ли дескрипторы неявно открыты процессом System? Я мог бы представить, что после сбоя процесса дескриптор может оставаться открытым, и процесс System каким-то образом получает полномочия этого дескриптора.
- Могу ли я что-то сделать в своем приложении, чтобы предотвратить это?
8 ответов
Это звучит для меня как проблема уровня водителя с утечкой ручки.
Если вы используете антивирусный пакет, попробуйте обновить, отключить (временно!) Или переключиться на другой бренд.
Файлы, к которым осуществляется доступ через общий ресурс, будут заблокированы системным процессом (PID 4).
Попробуйте открыть compmgmt.msc
-> Системные инструменты -> Общие папки -> Открыть файлы, чтобы увидеть, есть ли там заблокированный файл
См. Также форум sysinternals для способа воспроизвести это.
Однако не все приложения блокируют файлы при их открытии, а Excel блокирует их. Я не знаю, делает ли Access то же самое...
Вот еще одна возможная причина, которую я нашел:
Существует ошибка в Windows 7 и, вероятно, в Windows Server 2008 (возможно, только 64-битные версии). Он появляется при отключении службы Application Experience и вызывает те же проблемы, что описаны в вопросе.
Повторное включение этой службы устранило эту проблему для меня.
Здесь немного больше информации о том, почему это вызывает проблему.
Список других вопросов SO, которые кажутся связанными:
Это может быть длительный сеанс с удаленного компьютера в общую папку. Если это так, его можно разблокировать из командной строки:
net session /delete
Для меня это был "Защитник Windows" (антивирус). Я исключил свои папки сборки Visual Studio из списка проверяемых Защитником Windows, и проблема исчезла. (Visual Studio не удалось собрать файл EXE, PID 4 блокировал его для проверки на наличие вирусов)
Ваш сервер настроен на периодическое резервное копирование файлов?
Если да, выполняется ли резервное копирование как Система, возможно, запрашивает заблокированный файл при возникновении конфликта?
Для меня я должен был ударить его кувалдой. Chkdsk /f на диске, где находилась папка, исправил это. Используйте с осторожностью.
Проверьте настройки безопасности для каждой папки и подпапок. Убедитесь, что система не просто автоматически создала специальный параметр разрешений, который не позволит никому удалить файл. Очевидно, по какой-то странной причине ОС создает странные специальные настройки разрешений, которые защищают файл от удаления.