Por que o apt não exibe uma mensagem de erro mesmo se o flock for usado?

3

Execução de script

#!/bin/bash
(
 flock 9 
  # ... commands executed under lock ...
 fuser -v /var/lib/dpkg/lock
 apt-get -f --assume-no install
) 9>/var/lib/dpkg/lock

como superusuário não exibe uma mensagem de erro. Mas se houver, e. synaptic em execução, apt-get exibirá uma mensagem de erro: "E: Não foi possível obter o bloqueio / var / lib / dpkg / lock - aberto (11: Recurso temporariamente indisponível)".

    
por jarno 30.09.2017 / 11:43

1 resposta

1

dpkg (e por sua vez o apt) não usa flock(2) para bloqueio. Verificando as chamadas do sistema, envolvidas, parece que elas usam fcntl(2) :

$ sudo strace -f -e trace=desc apt install foo |& grep -B2 F_SETLK
close(4)                                = 0
open("/var/lib/dpkg/lock", O_RDWR|O_CREAT|O_NOFOLLOW, 0640) = 4
fcntl(4, F_SETFD, FD_CLOEXEC)           = 0
fcntl(4, F_SETLK, {l_type=F_WRLCK, l_whence=SEEK_SET, l_start=0, l_len=0}) = -1 EAGAIN (Resource temporarily unavailable)
close(4)                                = 0

E de esta postagem do SO :

  

No Linux, lockf() é apenas um wrapper em torno de fcntl() , enquanto flock()   os bloqueios são separados (e só funcionam em sistemas de arquivos locais, não em   por exemplo. Montagens NFS). Ou seja, um processo pode ter uma consultoria exclusiva    flock() bloqueia em um arquivo, enquanto outro processo tem um aviso    fcntl() exclusivo bloqueia no mesmo arquivo. Ambos são bloqueios consultivos,   mas eles não interagem.

Portanto, flock não é eficaz em bloqueá-lo em relação a outros comandos de gerenciamento de pacotes. (Pensando nisso ... se fosse, então o subsequente apt-get teria falhado de qualquer maneira.)

    
por muru 16.11.2017 / 10:55