What process created the /var/lib/dpkg/lock-frontend file in Ubuntu?
I have just booted my clean Ubuntu 18.04 LTS VM and tried to install some application with sudo apt install . But got error message:
E: Could not get lock /var/lib/dpkg/lock-frontend — open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
What process created the /var/lib/dpkg/lock-frontend file in Ubuntu?
How to gently stop it and take manual control on APT?
1 Answer 1
As was recommended in comments — I have checked the owner of the file
$ sudo fuser -v /var/lib/dpkg/lock-frontend USER PID ACCESS COMMAND /var/lib/dpkg/lock-frontend: root 2112 F. unattended-upgr $ ps aux | grep 2112 root 2112 66.5 8.1 366108 113508 ? Sl 13:03 0:28 /usr/bin/python3 /usr/bin/unattended-upgrade --download-only $ dpkg -S /usr/bin/unattended-upgrade unattended-upgrades: /usr/bin/unattended-upgrade
So this file was created by /usr/bin/unattended-upgrade from unattended-upgrades package. I can kill it with:
sudo apt install -f sudo dpkg --configure -a sudo apt-purge unattended-upgrades
as I forgot to purge it on this VM.
Note: do not purge unattended upgrades on your system if unsure. It needs some time to finish (depends on internet connection speed and disk speed) and then you can use APT as usual.
Ошибка при выполнении 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. Как правило, эти способы помогают. Если у вас остались какие-либо вопросы, оставляйте их в комментариях.
How /var/lib/dpkg/lock works?
/var/lib/dpkg/lock is file that holding a lock when «A package manager is working». But how this system works? I have /var/lib/dpkg/lock everytime when I have Linux working. When I use one of package manager for dpkg I have it without any change. So I can’t see it in action.
3 Answers 3
I don’t know for certain, but this is most likely implemented via flock() . The flock() system call creates an advisory lock on a file. If another application tries to attain a lock on the file, the kernel will block until the original lock is gone, or return EWOULDBLOCK if the LOCK_NB option is given. This locking mechanism would allow the lock file to be used without deleting and re-creating it.
Update: Checked the source and verified that it is advisory locking, but it doesn’t use flock() directly. fcntl is used:
if (modstatdb_is_locked()) puts(_( "Another process has locked the database for writing, and might currently be\n" "modifying it, some of the following problems might just be due to that.\n")); head_running = true; >
modstatdb_is_locked(void) < int lockfd; bool locked; if (dblockfd == -1) < lockfd = open(lockfile, O_RDONLY); if (lockfd == -1) ohshite(_("unable to open lock file %s for testing"), lockfile); >else < lockfd = dblockfd; >locked = file_is_locked(lockfd, lockfile); /* We only close the file if there was no lock open, otherwise we would * release the existing lock on close. */ if (dblockfd == -1) close(lockfd); return locked; >
file_is_locked(int lockfd, const char *filename)
Advisory locking F_GETLK, F_SETLK and F_SETLKW are used to acquire, release, and test for the existence of record locks (also known as file-segment or file-region locks). The third argument, lock, is a pointer to a structure that has at least the following fields (in unspecified order).