Ошибка чтения файла блокировки

Обновлено: 02.07.2024

Ошибки «E: Не удалось получить доступ к файлу блокировки /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)» и «E: Невозможно заблокировать каталог /var/lib/apt/lists/»

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

Иногда при использовании утилитой apt (консольного менеджера пакетов), например, при обновлении информации о пакетах, либо про попытке установить новый пакет, возникает примерно следующая ошибка:


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

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

Если в этой ситуации удалить файлы-блокировщики (/var/lib/apt/lists/lock), как это иногда советуют, то в результате фоновый процесс apt преждевременно завершит свою работу, либо вы запустите второй экземпляр apt – оба эти варианта приведут к проблемам с пакетами, и, вероятнее всего, при последующей попытке использовать apt система предложит вам запустить программу с ключом -f:

Как отключить автоматический запуск службы apt

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

Чтобы увидеть, какие службы apt присутствуют в системе, выполните команду:


Вероятно, вы увидите там такие службы как:

  • apt-daily.timer – ежедневный таймер службы для скачивания новых пакетов
  • apt-daily-upgrade.timer – ежедневный таймер службы для обновления и очистки пакетов
  • apt-daily.service – непосредственно запускает скачивание новых пакетов (команда /usr/lib/apt/apt.systemd.daily update), вызывается таймером
  • apt-daily-upgrade.service – непосредственно запускает установку новых пакетов и очистку кэша (команда /usr/lib/apt/apt.systemd.daily install), вызывается таймером

Следующая команда выведет только список служб apt, которые добавлены в автоматическую загрузку:


Скорее всего, это службы apt-daily-upgrade.timer и apt-daily.timer, чтобы отключить их автоматический запуск при старте системы, выполните команды:

Отключение unattended-upgrades

Кроме автоматического запуска apt, в системах на базе Debian имеются включенные по умолчанию unattended-upgrades – те же самые автоматические обновления.

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

Для изменения этих настроек можно отредактировать файл /etc/apt/apt.conf.d/20auto-upgrades, в нём имеются следующие строки:

Первая отвечает за обновление списка пакетов, а вторая – за обновления самих пакетов в системе. Этот файл можно изменить вручную (чтобы остановить автоматическое обновление, вместо 1 впишите 0) либо запустить конфигуратор:


Переключения между кнопками, используйте клавишу <TAB>, для выбора используйте <ENTER>.


Что характерно, в Kali Linux по умолчанию отключены автоматические службы apt как и вообще все сетевые службы, которые так или иначе используют доступ в сеть, но почему-то включены unattended-upgrades – либо авторы известного дистрибутива забыли о них, либо считают эти обновления важными.

Отключение автоматической загрузки обновлений программ в GNOME 3

Если там будет true, значит автоматическая загрузка обновлений включена.

Чтобы её отключить выполните:

Как обновить Linux в командной строке

С одной стороны, отключение автоматических обновлений и скачивание новых файлов пакетов навсегда избавит вас от ошибки «E: Невозможно заблокировать каталог /var/lib/apt/lists/» и других подобных, но при этом вам нужно будет самостоятельно выполнять обновление и очистку пакетов.

Для полного обновления системы выполняйте:

А для очистки пакетов используются команды:

Аварийное завершение работы во время обновления системы или установки программ

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

Скорее всего, чтобы вновь появилась возможность использовать apt понадобиться выполнить следующую команду, для исправления проблем:

Заключение

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

Как сделать блокировку на чтение файла в php во время чтения?
В разделяемой блокировке меня смущает слово "разделяемая".

Yakud

woonem

woonem

разве с помощью flock можно сделать эксклюзивную блокировку на чтение?

Yakud

Вадим Егоров: В документации все описано.
"PHP поддерживает портируемый способ консультативной блокировки (adviosory locking) полностью всего файла (что означает, что все программы, осуществляющие доступ к файлу, должны использовать один и тот же способ блокировки, иначе блокировка не будет работать). По умолчанию, данная функция будет ждать получения блокировки; это поведение можно изменить с помощью описанного ниже параметра LOCK_NB."

Yakud

Вадим Егоров: для flock нет никакой разницы, на чтение или на запись. Устанавливается блокировка на файл.
Вызов flock($fp, LOCK_EX) не вернет истину, если блокировка установлена. Соответственно, Вам нужно читать из файла, когда процессу удалось произвести блокировку файла. Это означает, что в данный момент он свободен.

woonem

Леша Киселев: я пытался делать так:

index.php (на белом сервере; вызывает пользователь)

woonem

Леша Киселев: а я думал что flock делает sleep, пока не разблокируется требуемый файл
оказывается ничего он не ждет, а просто выдает ошибку

Yakud

Вадим Егоров:
"оказывается ничего он не ждет, а просто выдает ошибку"

Из доки:
"Также возможно добавить константу LOCK_NB в качестве битовой маски к любой из вышеуказанных операций, если вы не хотите ждать пока flock() получит блокировку."

woonem

Леша Киселев:
разве это ничего не значит
LOCK_SH для получения разделяемой блокировки (чтение).
LOCK_EX для получения эксклюзивной блокировки (запись).

woonem

Леша Киселев: что за бред??
вообще обьясняли что такое flock рукожопы какие-то
масло масленое


wouldblock
Необязательный третий параметр будет установлен в 1, если блокировка будет блокирующей (код ошибки EWOULDBLOCK). (не поддерживается на Windows)

Yakud

Вадим Егоров: Да, сорян, проглядел. Очевидно, что вы хотите сделать эксклюзивную блокировку, что бы другой процесс не смог записать данные в файл. Соответсвенно, нужно блокировать файл на запись!

Yakud

Вадим Егоров:
Другой процесс перед записью, должен попытаться поставить точно такую же блокировку!
flock($f, LOCK_EX | LOCK_NB);

Yakud

Вадим Егоров:
"LOCK_NB чтобы не ждать, пока будет получена блокировка (не поддерживается в Windows)." Внимание на инфу по винде.

И да, файл стоит открывать с режимом "rw+", т.к.
"Из-за того, что функции flock() необходим указатель на файл, вам может понадобиться воспользоваться специальным запирающим файлом для того, чтобы ограничить доступ к файлу, который вы намерены очищать, путём его открытия в режиме записи (используя "w" или "w+" в качестве аргумента функции fopen())."


Ошибка, связанная с недостаточными правами пользователя, может возникнуть после того, как в системе заведен новый пользователь. У каждого пользователя 1С на программном уровне есть определенные права доступа. Такой набор прав называется ролью, а определяется он в конфигураторе. Если используется клиент-серверная версия программы, установка прав осуществляется на уровне сервера SQL.

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

Но стабильная работа 1С не обеспечивается только настройкой прав на уровне программы. Связано это с тем, что доступ к базе данных, как и к любому другому типу файлов, регламентируется путем настройки прав на уровне операционной системы. Ошибка открытия файла блокировок может возникать, если таких прав недостаточно. В данном случае речь идет о файле 1Cv8.1CL, находящемся внутри базы 1Cv8.1CD.

Соответственно, для того, чтобы пользователь смог полноценно работать с файлом, он должен получить ряд разрешений. Для этого необходимо открыть окно свойств папки или файла и перейти на вкладку "Безопасность". Чтобы сделать этот процесс проще и не тратить время на изменение свойств файлов и папок для каждого сотрудника отдельно, администратор может создать новую группу пользователей, которой будут предоставлены соответствующие права, а также открыт доступ к системным папкам AppData и Temp (которые тоже зачастую вызывают определенные проблемы). В дальнейшем достаточно просто добавлять в эту группу необходимые рабочие места.

Антивирусное ПО

Пользователи некоторых редакций операционных систем семейства Windows заметили, что их брандмауэры могут блокировать удаленный доступ к базе данных 1С. Аналогичная ситуация возникает с антивирусом "Kaspersky". Во избежание подобных проблем файл 1Cv8.1CD необходимо внести в список исключений брандмауэра Windows и антивирусной программы.

Остались вопросы? Мы с радостью поможем Вам в их решении.

Читайте также: