Eu já vi muitos softwares, como o Update Manager e o Synaptic Package Manager, eles esperam se algum outro programa estiver usando o /var/lib/dpkg/lock
e está bloqueado. Como podemos fazer isso através do terminal? Eu vi apt-get
o manual, mas não achei nada útil.
command-line
apt
Piyush
fonte
fonte
sudo apt-get install packagename && sudo apt-get update
e eles acontecerão automáticos um após o outro.sudo apt-get install packagename1 packagename2 packagename3
:?Respostas:
Você pode usar o
aptdcon
comando para enfileirar tarefas do gerenciador de pacotes se comunicando com o aptdaemon em vez de usar o apt-get diretamente.Então, basicamente, você pode simplesmente fazer o que
sudo aptdcon --install chromium-browser
quer que seja e enquanto esse comando estiver em execução, você poderá executá-lo novamente, mas instalar pacotes diferentes e o apt-daemon irá enfileirá-los em vez de errar.Isso é especialmente útil se você estiver fazendo uma atualização longa ou algo assim e quiser continuar instalando pacotes ou se estiver criando scripts juntos e quiser garantir que a instalação seja mais confiável.
fonte
aptdcon
ser executado de forma a aceitar qualquer solicitação, comoapt-get -y
faz?yes | aptdcon --hide-terminal --install "package"
Ocultar terminal é necessário; caso contrário, a tubulaçãoyes
causará problemas.aptdcon
. Estou trabalhando em um script de auto-inicialização que faz a configuração inicial de um VPS, onde um processo em segundo plano também faz algumas configurações iniciais. Não consigo instalaraptdcon
até conseguir solucionar o bloqueio.aptdcon
?Você pode
apt-get
aprender a esperar se outro gerenciador de software estiver em execução. Algo semelhante ao comportamento do próximo elenco da tela:Como eu fiz isso?
Eu crio um novo script chamado
apt-get
(wrapper forapt-get
) no/usr/local/sbin
diretório com o seguinte código bash:Não se esqueça de torná-lo executável:
Antes de testar, verifique se está tudo bem. A saída do
which apt-get
comando deve ser agora/usr/local/sbin/apt-get
. O motivo é: por padrão, o/usr/local/sbin
diretório é colocado antes do/usr/bin
diretório no usuário ou raizPATH
.fonte
apt
coisas na inicialização, então meudpkg
comando falhou devido ao dpkg db bloqueado. Eu coloquei essa linha em meus dados de usuário na nuvem:while fuser /var/lib/dpkg/lock >/dev/null 2>&1; do sleep 1; done; dpkg -i package.deb
e funciona muito bem.Além do óbvio
&&
, você pode estar procurandoaptdcon
. Esta ferramenta é capaz de detectar outras instâncias do apt e esperar que elas terminem:(Estou executando o aptitude em outro lugar)
A vantagem dessa ferramenta é que você pode estocar várias ações consecutivamente sem se preocupar com o que fará em seguida.
aptdcon
é ideal para scripts autônomos e instalação da GUI, pois você pode permitir que a ferramenta seja executada em segundo plano para não bloquear seu front-end.As operações suportadas por
aptdcon
são:--refresh
,-c
: Isso é equivalente aapt-get update
. Ele atualiza sua lista de pacotes.--install
,--remove
,--upgrade
,--purge
,--downgrade
. Cada um deles faz como seus nomes dizem. O nome do (s) pacote (s) é obrigatório.-i
,-r
,-u
,-p
: Estes são os curtas opções para todos, exceto downgrade, que não tem um.--safe-upgrade
,--full-upgrade
são os equivalentes aapt-get
'supgrade
/dist-upgrade
eaptitude
' ssafe-upgrade
/full-upgrade
. Estes não precisam de parâmetros.aptd
. Há opções que se sobrepõem com o queapt-key
,apt-cache
,dpkg
fazer.apt-get
ele próprio não suporta esses métodos (para aguardar outras instâncias do apt), assimaptdcon
como a solução preferida para os gerenciadores de pacotes da GUI: a USC usaaptd
como back-end, o mesmo que o Synaptic. Outra solução épackagekit
, mas ainda não suporta a função que você está procurando.fonte
aptdcon --install /path/to/pgk.deb
Funciona comodpkg -i
, embora eu não tenha conseguido encontrar isso explicitamente mencionado no manual.Uma abordagem muito simples seria um script que esperasse o bloqueio não ser aberto. Vamos chamá-lo
waitforapt
e colocá -lo em/usr/local/bin
:Então apenas corra
sudo waitforapt && sudo apt-get install whatever
. Você pode adicionar exceçõessudoers
para permitir que você a execute sem precisar de uma senha (você precisará dela paraapt-get
que não haja grande ganho).Infelizmente, isso não enfileira as coisas. Dado que algumas das operações do apt são interativas ("Tem certeza de que deseja remover todos esses pacotes ?!"), não consigo ver uma boa maneira de contornar isso ...
fonte
-y
assumir sim para todas as operações?-y
é desejável embora.sudo fuser
em[[ $(...) ]]
. Retorna um código de saída zero quando o arquivo está sendo acessado, o que deve ser suficiente.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
Você pode usar uma técnica de pesquisa:
fonte
inotify
Eu fiz um script que faz isso:
Salve o acima em
/usr/local/sbin/apt-get
.apt-get
aguardará se outra instância já estiver em execução.Como alternativa, salve-a como
/usr/local/sbin/apt-wait
exemplo de uso:que será executado
aptitude
após a saída do processo atual que contém o bloqueio.fonte
inotify
Infelizmente, o fusor não faz muito por você quando você está executando em contêineres de namespace sem privilégios diferentes, como o lxc.
Além disso, o aptdcon não é instalado por padrão (pelo menos no 18.04) e coloca sua tarefa em segundo plano em uma fila para que você perca a serialização. Isso não é intransponível, mas significa que sua automação precisa ter uma maneira de evitar erros de agrupamento no apt durante a instalação do aptdcon, e você precisará de algum tipo de espera para qualquer coisa que precise serializar após a instalação de pacotes via aptdcon a menos que já exista algum tipo de sinalizador para isso.
O que funciona é rebanho. Isso também deve funcionar com o NFS etc., pois usa o bloqueio do sistema de arquivos da mesma maneira que o apt, apenas com o parâmetro -w segundos que ele aguardará no seu bloqueio em vez de gerar um erro.
Portanto, seguindo o modelo do wrapper, adicione-o como apt-get em / usr / local / bin / e compartilhe.
Isso também tem o benefício de limitar a E / S, não permitindo o paralelismo no apt, para que você possa permitir que o cron acione atualizações à meia-noite em qualquer lugar, sem bater o disco.
Um pedido de recurso muito agradável e simples para o apt-get seria um sinalizador -w para alternar para um bloqueio de bloqueio / espera.
fonte
fuser
como mostrado em muitas respostas, porquefuser
ainda é propenso a condições de corrida entre assistir a trava e o processo de destino pegando a trava novamente. Comflock
o bloqueio é adquirido e depois passado para o processo de destino, para que não haja tempo para perder o bloqueio nesse meio tempo.Uma linha com base na resposta de Oli :
fonte