Я видел много программ, таких как Update Manager и Synaptic Package Manager, они ждут, если какая-то другая программа использует /var/lib/dpkg/lock
и заблокирована. Как мы можем сделать это через Терминал? Я видел apt-get
руководство, но не нашел ничего полезного.
command-line
apt
Piyush
источник
источник
sudo apt-get install packagename && sudo apt-get update
и они будут происходить автоматически после друг друга.sudo apt-get install packagename1 packagename2 packagename3
?Ответы:
Вы можете использовать в
aptdcon
команду в очереди диспетчера пакетов задач, связываясь с aptdaemon вместо того , чтобы использовать APT-получить непосредственно.Таким образом, в основном вы можете просто делать
sudo aptdcon --install chromium-browser
что угодно, и пока эта команда выполняется, вы можете запустить ее снова, но установить разные пакеты, и apt-daemon просто поставит их в очередь, а не выдает ошибку.Это особенно полезно, если вы делаете длительное обновление или что-то еще и хотите продолжать устанавливать пакеты, или если вы что-то пишете вместе и хотите убедиться, что установка будет более надежной.
источник
aptdcon
быть запущен так, что он принимает любые запросы, как этоapt-get -y
делает?yes | aptdcon --hide-terminal --install "package"
Скрыть терминал необходим, иначе трубопроводyes
вызовет проблемы.aptdcon
. Я работаю над скриптом начальной загрузки, который выполняет начальную настройку VPS, где фоновый процесс также выполняет некоторые начальные настройки. Я не могу установить,aptdcon
пока не смогу обойти замок.aptdcon
?Вы можете
apt-get
научиться ждать, если работает другой менеджер программного обеспечения. Нечто подобное с поведением из следующего скриншота:Как я это сделал?
Я создаю новый скрипт с именем
apt-get
(обертка дляapt-get
) в/usr/local/sbin
каталоге со следующим кодом bash внутри:Не забудьте сделать его исполняемым:
Перед тестированием проверьте, все ли в порядке. Вывод
which apt-get
команды должен быть сейчас/usr/local/sbin/apt-get
. Причина в том, что по умолчанию/usr/local/sbin
каталог помещается перед/usr/bin
каталогом пользователя или пользователя rootPATH
.источник
apt
вещи при загрузке, поэтому мояdpkg
команда завершилась неудачно из-за заблокированного dpkg db. Я поместил эту однострочную строку в свои пользовательские данные cloudinit:while fuser /var/lib/dpkg/lock >/dev/null 2>&1; do sleep 1; done; dpkg -i package.deb
и она прекрасно работает.Помимо очевидного
&&
, вы можете искатьaptdcon
. Этот инструмент может обнаружить другие экземпляры apt и дождаться их завершения:(Я работаю в другом месте)
Преимущество этого инструмента заключается в том, что вы можете хранить несколько действий подряд, не беспокоясь о том, что вы будете делать дальше.
aptdcon
идеально подходит для автоматических сценариев и установки с графическим интерфейсом, поскольку вы можете позволить инструменту работать в фоновом режиме, чтобы не блокировать ваш веб-интерфейс.Поддерживаемые операции
aptdcon
:--refresh
,-c
: Это эквивалентноapt-get update
. Он обновляет ваш список пакетов.--install
,--remove
,--upgrade
,--purge
,--downgrade
. Каждый из них делает, как говорят их имена. Название пакета (ов) является обязательным.-i
,-r
,-u
,-p
: Это короткие варианты для всех , кроме понижения рейтинга, который не имеет ни одного.--safe-upgrade
,--full-upgrade
являются аналогамиapt-get
'supgrade
/dist-upgrade
иaptitude
' ssafe-upgrade
/full-upgrade
. Это не нуждается в параметрах.aptd
. Есть варианты, которые пересекаются с темapt-key
, чтоapt-cache
,dpkg
делать.apt-get
сама по себе не поддерживает такие методы (для ожидания других экземпляров apt), поэтомуaptdcon
является предпочтительным решением для менеджеров пакетов GUI: USC используетaptd
как back-end, так же как Synaptic. Другое решениеpackagekit
, но оно не поддерживает функцию, которую вы ищете (пока).источник
aptdcon --install /path/to/pgk.deb
Работает какdpkg -i
, хотя я не смог найти это явно упоминается в руководстве.Очень простым подходом будет сценарий, который ожидает, пока блокировка не будет открыта. Давайте назовем это
waitforapt
и вставим в/usr/local/bin
:Тогда просто беги
sudo waitforapt && sudo apt-get install whatever
. Вы можете добавить исключения,sudoers
чтобы позволить вам запускать его без пароля (он понадобится вам,apt-get
так что это не очень выгодно).К сожалению, это не стоит в очереди. Учитывая, что некоторые операции apt являются интерактивными («Вы уверены, что хотите удалить все эти пакеты ?!»), я не могу найти хороший способ обойти это ...
источник
-y
предположить да для всех операций?-y
желательно, хотя.sudo fuser
в[[ $(...) ]]
. Он возвращает нулевой код завершения при доступе к файлу, поэтому этого должно быть достаточно.while sudo fuser /var/lib/dpkg/lock /var/lib/apt/lists/lock /var/cache/apt/archives/lock >/dev/null 2>&1; do echo 'Waiting for release of dpkg/apt locks'; sleep 5; done; sudo apt-get -yy update
Вы можете использовать технику опроса:
источник
inotify
Я сделал скрипт, который делает это:
Сохранить выше в
/usr/local/sbin/apt-get
.apt-get
затем будет ждать, если другой экземпляр уже запущен.В качестве альтернативы, сохраните его как
/usr/local/sbin/apt-wait
пример использования:который будет запущен
aptitude
после завершения текущего процесса, удерживающего блокировку.источник
inotify
К сожалению, fuser мало что делает для вас, когда вы работаете в разных непривилегированных контейнерах пространства имен, таких как lxc.
Кроме того, aptdcon не устанавливается по умолчанию (по крайней мере, 18.04) и помещает вашу задачу в очередь, поэтому вы теряете сериализацию. Это не является непреодолимым, но это означает, что ваша автоматизация должна иметь какой-то способ избежать ошибок flock в apt при установке aptdcon, и вам понадобится какой-то цикл ожидания для всего, что вам нужно сериализовать после установки пакетов через aptdcon если для этого уже нет какого-то флага.
Что работает, так это стадо. Это также должно работать через NFS и т. Д., Поскольку он использует блокировку файловой системы точно так же, как и apt, только с параметром -w секунд он будет ожидать блокировки, а не выдавать ошибку.
Поэтому, следуя модели оболочки, добавьте это как apt-get в / usr / local / bin / и поделитесь.
Это также имеет преимущество в ограничении ввода-вывода, так как не допускает параллелизма в apt, так что вы можете позволить cron запускать обновления в полночь везде, не перегружая диск.
Очень хорошим и простым запросом функции для apt-get будет флаг -w для переключения на блокировку / ожидание блокировки.
источник
fuser
как показано во многих ответах, потому чтоfuser
все еще склонен к гонкам между просмотром блокировки и целевым процессом, снова захватившим блокировку. Сflock
блокировкой получается, а затем передается целевому процессу, поэтому у него не остается времени для потери блокировки в это время.Однострочник на основе ответа Оли :
источник