AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 777166
Accepted
user149408
user149408
Asked: 2024-05-26 18:54:13 +0800 CST2024-05-26 18:54:13 +0800 CST 2024-05-26 18:54:13 +0800 CST

Inibir trabalho agendado enquanto a instalação do pacote está em andamento

  • 772

Em um sistema baseado em Debian, tenho um trabalho agendado (por exemplo, cron job ou timer/serviço do systemd) que é executado a cada 30 minutos. No entanto, não quero que isso aconteça simultaneamente com a instalação ou atualização de pacotes.

A instalação do pacote pode acontecer manualmente ou de forma programada, mas neste último caso há um atraso aleatório considerável. Eu poderia adaptar o cronograma do meu trabalho para não interferir em uma possível atualização de pacote (esteja algo realmente instalado ou não) e lembrar de desabilitar o trabalho ao instalar pacotes manualmente e lembrar de habilitá-lo depois - mas isso não é realmente satisfatório .

Portanto, estou procurando uma maneira confiável de informar que a instalação do pacote está em andamento, para que meu trabalho possa verificá-lo e sair (ou atrasar a execução), se for esse o caso. Se as informações do repositório estiverem sendo atualizadas ou os pacotes estiverem sendo baixados em segundo plano simultaneamente com o meu trabalho, isso não é realmente um problema, mas meu trabalho não deve ser executado enquanto a instalação está acontecendo (cópia de arquivos, configuração, scripts pré/pós-instalação e semelhante).

No OPNsense (que é baseado no FreeBSD), o atualizador do sistema adquire um bloqueio em um arquivo específico, então envolvi meu trabalho dentro do arquivo flock. Se uma atualização estiver em andamento, meu trabalho será ignorado. Se uma atualização fosse acionada enquanto meu trabalho estivesse em execução, provavelmente a atualização falharia com uma mensagem indicando que outra atualização está em andamento.

Gostaria de saber se o apt no Debian tem algo semelhante, como um arquivo de bloqueio que eu possa verificar. Se sim – esse mecanismo é exclusivo para um determinado frontend de gerenciamento de pacotes ou funcionaria com todas as ferramentas padrão para pacotes .deb (por exemplo, dpkg, apt, aptitude, synaptic e similares)?

Vejo que quando o Synaptic está aberto e tento executar sudo apt-get upgrade, recebo:

E: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 1234 (synaptic)
N: Be aware that removing the lock file is not a solution and may break your system.
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

No entanto, sudo flock -n /var/lib/dpkg/lock-frontend sleep 10 || echo File is lockedé bem-sucedido (ou seja, flockretorna true, indicando que obtive o bloqueio, sleepé executado enquanto echonão) mesmo enquanto o Synaptic está em execução (embora não esteja instalando nada no momento). Mesmo comportamento com /var/lib/dpkg/lock.

Então, como posso obter um “bloqueio na instalação do pacote”?

debian
  • 1 1 respostas
  • 31 Views

1 respostas

  • Voted
  1. Best Answer
    user149408
    2024-05-30T23:52:04+08:002024-05-30T23:52:04+08:00

    Gerenciadores de pacotes no Debian – a julgar pelos resultados dos meus testes, isso apttambém é verdade para frontends dpkg– bloqueia dois arquivos /var/lib/dpkg/locke /var/lib/dpkg/lock-frontend. De acordo com meus testes, o Synaptic bloqueia os dois arquivos assim que a GUI é ativada e os mantém até sair.

    No entanto, existem diferentes tipos de bloqueios no Linux, que não têm garantia de compatibilidade entre si, portanto, ambos os métodos podem adquirir um bloqueio exclusivo no mesmo arquivo ao mesmo tempo:

    • flock(1), que chama flock(2)internamente, e
    • lockf(3), que chama fcntl(2)internamente

    Conforme detalhado nesta resposta , dpkgusa e sempre usou fcntl(2)internamente. Infelizmente, embora flock(2)venha com um wrapper de linha de comando disponível na maioria dos sistemas Debian, não consegui encontrar um equivalente para fcntl(2). Suas opções são instalar chiark-utils-bin, o que fornece with-lock-ex(1), ou escrever algum código Python. O seguinte funcionou para mim, na medida em que relata o arquivo como bloqueado quando o Synaptic está em execução, mas relata sucesso quando nenhuma ferramenta apt está em execução:

    fname = '/var/lib/dpkg/lock'
    
    try:
        f = open(fname, 'w')
        fcntl.lockf(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
        print('Successfully locked {}'.format(fname))
        input('Press Enter to continue...')
    except IOError as e:
        # e.errno == errno.EAGAIN indicates the file is locked,
        # everything else indicates another error (e.g. permission denied)
        print('Unable to lock {}: {}'.format(fname, os.strerror(e.errno)))
    

    Após o teste, posso confirmar que isso impede a execução simultânea do programa Python em questão e do gerenciador de pacotes – quem tentar adquirir o bloqueio primeiro o consegue, outros processos terão que tentar novamente mais tarde. O Atualizador de Software exibe Waiting for python3 to finishse o programa Python mantém o bloqueio; o programa Python exibirá a mensagem de erro se o Synaptic estiver em execução ou o Update Manager estiver instalando atualizações.

    Não há necessidade de liberar explicitamente o bloqueio – isso acontece automaticamente quando o processo que o mantém é encerrado.

    • 0

relate perguntas

  • Configuração do GRUB para reconhecer diferentes ambientes de desktop (instalações) da mesma distribuição Linux

  • astyle não altera a formatação do arquivo de origem

  • Recebendo e-mail em um novo Debian fresco

  • Debian Stretch: gnome-software segfault em libgs_plugin_systemd-updates.so

  • Como digitar ü no Pinyin IME?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve