- Ошибка Unable to lock the administration directory /var/lib/dpkg
- Что значит эта ошибка
- Как исправить Unable to lock the administration directory /var/lib/dpkg
- Выводы
- Ошибка при выполнении apt: Unable to acquire the dpkg lock /var/lib/dpkg/lock
- Как исправить
- Способ первый
- Способ второй
- Заключение
- Unable to lock file using flock with file descriptor
- 1 Answer 1
Ошибка Unable to lock the administration directory /var/lib/dpkg
При использовании утилиты apt для установки или обновления программного обеспечения в таких дистрибутивах как Ubuntu и Debian, в терминале можно столкнуться со следующей ошибкой: Unable to lock directory /var/lib/apt/lists.
Данная ошибка очень проста и исправить её не составит труда, но для новых пользователей она может показаться серьезным препятствием. В этой статье будет рассмотрено что означает ошибка Unable to lock directory /var/lib/apt/lists, а также как устранить эту проблему.
Что значит эта ошибка
В операционной системе Ubuntu 20.04 получить данную ошибку можно при выполнении таких команд как apt update, apt upgrade или apt install. А полный текст ошибки выглядит вот так:
- E: Could not get lock /var/lib/apt/lists/lock. It is held by process 4746 (aptd)
- N: Be aware that removing the lock file is not a solution and may break your system.
- E: Unable to lock directory /var/lib/apt/lists/
Так же можно получить следующую ошибку:
Waiting for cache lock: Coud not get lock /var/lib/dpkg/lock-frontend. It is held by process
Если дословно перевести значение данной ошибки, то утилита сообщает что не может создать файл блокировки /var/lib/apt/lists/lock далее утилита спрашивает нет ли уже запущенного второго экземпляра программы apt, который уже создал этот файл и сейчас работает с данной директорией.
Как правило данная ошибка появляется из-за того, что уже запущен другой экземпляр программы apt который или обновляет пакеты операционной системы или устанавливает какие-либо программы. Когда команда apt или графическое приложение для обновления системы обновляют систему или устанавливают новое программное обеспечение, они блокируют файл dpkg (менеджер пакетов в операционных системах семейства Debian).
Эта блокировка выполняется для того, чтобы два процесса не изменяли содержимое файла dpkg одновременно, так как это может привести к неоправданному риску поломки всей системы.
Также данная ошибка может возникать при выполнении автоматических обновлений. За данную опцию отвечает пакет под именем unattended-upgrades который как правило присутствует в большинстве дистрибутивов по умолчанию и запускается автоматически при загрузке операционной системы.
Как исправить Unable to lock the administration directory /var/lib/dpkg
Существует несколько способов решения данной проблемы. Рассмотрим все возможные варианты. Первый способ этой найти запущенный процесс apt и завершить его. Для этого сначала необходимо выполнить команду в терминале:
Данная команда отобразит идентификатор процесса, выполняющего процесс apt. В приведенном выше примере идентификатор процесса — 28382.
Можно использовать идентификатор процесса, чтобы завершить его. Необходимо заменить идентификатор процесса числом, которое было получено в выводе предыдущей команды. В данном примере это число 28382. Команда будет выглядеть следующем образом:
Далее необходимо проверить, был ли процесс остановлен, запустив команду ps aux | grep -i apt еще раз. Если процесс все еще работает, его необходимо принудительно уничтожить при помощи команды:
Другой, более простой способ — использовать команду killall, она завершит все экземпляры запущенной программы. Для этого необходимо выполнить команду:
Второй способ заключается в удаление файлов блокировки. Но, прежде чем удалять данные файлы, необходимо остановить процессы, использующие файлы блокировки. Для этого необходимо выполнить одну из следующих команд ориентируясь на ту, которая вернет число:
sudo lsof /var/lib/apt/lists/lock
sudo lsof /var/cache/apt/archives/lock
Возможно, команды ничего не будут возвращать или вернут только одно число. Полученное число из вывода необходимо использовать чтобы завершить процесс (необходимо заменить process_id числом, полученным из приведенных выше команд):
И только после этого можно безопасно удалить файлы блокировки, используя следующие команды:
sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
После удаления файлов блокировки необходимо переконфигурировать пакеты при помощи команды:
Выводы
В данной статье были рассмотрены два способа решения ошибки Unable to lock directory /var/lib/apt/lists которая может вызвать затруднения у новых пользователей. Но теперь вы знаете почему она появляется и как с ней бороться. Если у вас остались вопросы, пишите в комментариях!
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Ошибка при выполнении apt: Unable to acquire the dpkg lock /var/lib/dpkg/lock
Ошибка может появляться не только при выполнении apt install, но и при любых других действиях с apt или apt-get.
Сообщение об ошибке может немного отличаться в зависимости от различных условий. Например, могут появляться следующие ошибки:
E: Could not get lock /var/lib/dpkg/lock – open (11: Resource temporarily unavailable) E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it? E: Could not get lock /var/lib/apt/lists/lock – open (11: Resource temporarily unavailable) E: Unable to lock directory /var/lib/apt/lists/ E: Could not get lock /var/lib/dpkg/lock – open (11: Resource temporarily unavailable) E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
Как исправить
Данные ошибки появляются, когда программа apt-get (apt) не может получить доступ к файлу блокировки /var/lib/dpkg/lock* . Данный файл используется, чтобы запретить одновременное выполнение операций, связанных с управлением пакетами в системе, так как при одновременном изменении данных о пакетах будет нарушена целостность «пакетной базы».
Обычно существует две основные причины появления, описанных выше ошибок:
- В данный момент уже выполняется экземпляр программы apt-get (apt).
- Предыдущий вызов apt-get (apt) завершился некорректно.
Способ первый
Сначала нужно проверить, что уже не запущен другой экземпляр программы apt-get (apt). Выполним следующую команду, чтобы проверить есть ли apt в списке запущенных процессов:
Вывод команды может быть следующим:
root 9425 0.0 0.0 79516 3752 pts/1 S+ 10:31 0:00 sudo apt-get install inkscape pingvin+ 9456 0.0 0.0 38892 944 pts/0 S+ 10:32 0:00 grep --color=auto -i apt
В первой строке мы видим, что уже есть работающий экземпляр программы apt-get, который имеет PID (идентификатор) 9425. Вторая строка относится к нашей команде grep, которую мы запустили с аргументом apt, поэтому она вывела саму себя. Итак, нас интересует только первая строка.
Если вы уверены, что не запускали программу apt-get сами, или она не запущена в фоновом режиме, например, выполняется автоматическое обновление системы, то нужно принудительно завершить ее выполнение. Для этого воспользуемся командой kill −9 . Команде нужно указать числовой идентификатор процесса. В нашем случае это 9425. Выполняем команду:
После выполнения данной команды, процесс с идентификатором 9425 завершится.
Можно воспользоваться еще одним простым способом — это завершить все экземпляры программ apt и apt-get сразу. Для этого можно выполнить команду:
Способ второй
Если первый способ вам не помог, то рассмотрим еще один способ решения проблемы. Обычно он используется, когда нет работающих экземпляров программ apt или apt-get, а значит предыдущее их выполнение завершилось аварийно, и файлы блокировки остались закрытыми.
Нам нужно удалить все файлы блокировки. Для этого выполняем команды:
sudo rm /var/lib/apt/lists/lock sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock sudo rm /var/lib/dpkg/lock-frontend
Если при выполнении каких-нибудь из этих команд появится сообщение: rm: невозможно удалить ’/var/../lock’: Нет такого файла или каталога , это нормально, не обращайте на него внимания.
После этого нужно выполнить переконфигурацию (донастройку) пакетов:
Заключение
Мы рассмотрели два способа решения ошибок, связанных с доступом к файлу блокировки dpkg. Как правило, эти способы помогают. Если у вас остались какие-либо вопросы, оставляйте их в комментариях.
Unable to lock file using flock with file descriptor
The above output shows that I first acquire an exclusive lock on /tmp/foo.txt in the first terminal. Then in the second terminal, when I try to acquire a lock on the same file, it fails. Now let me know what does not work. If I use flock with file descriptor, it does not work. Terminal 1:
[root@centos ~]# < flock -x -n 100; sleep 100; >100> /tmp/foo.txt
[root@centos ~]# < flock -x -n 100; sleep 100; >100> /tmp/foo.txt
The above output shows that I first try to acquire a lock on /tmp/foo.txt in the first terminal. Then in the second terminal, when I try to acquire a lock on the same file, it succeeds. I expected it to fail just like in the previous example. Why does it succeed?
1 Answer 1
You are using -n which will terminate if the lock cannot be acquired immediately and flock will fail with exit code 1. Therefore after you execute your the code in the first terminal, it sleeps for 100 seconds. Next when you execute the same in another terminal, flock fails and returns 1, but because there is a ; and you do not do anything with the return code, the shell simply continues to execute the next statement and sleeps for 100 seconds.
Therefore you need to take decision on the return code of flock as below.
( flock -x -n 100 || exit 55; sleep 100; ) 100> /tmp/foo.txt
Now if you execute the above line in one terminal it will sleep for 100 seconds. Next if you run the code on another terminal it will immediately return to prompt. Do an echo $? and you will see that it has returned 55 as we wanted to return using the || .
What the || does is short-circuiting. If flock returns 0 as in normal exit which is a true value for the shell, it will not execute the right hand side of the expression and therefore go to the next statement. If the return value is 1 which is a false for the shell, it will continue to evaluate the right hand side expression which is exit 55 and therefore exit. You can do this by if-then-fi also.
Also note that I have used brackets () instead of curly braces <> . This is because, if you use the curley-braces then the commands will be executed in the current shell and if you use exit, then it will exit from the current shell. A bracket will create a subshell, therefore doing an exit from there terminates the subshell and gets back you to your original shell.
It worked for your first example using -c because there you have the single command enclosed within the flock argument. Therefore if flock is unable to acquire the lock it will simply not execute the statement and terminate.