He visto muchos softwares como Update Manager y Synaptic Package Manager, esperan si algún otro programa está usando /var/lib/dpkg/lock
y está bloqueado. ¿Cómo podemos hacer esto a través de la Terminal? Vi apt-get
el manual pero no encontré nada útil.
command-line
apt
Piyush
fuente
fuente
sudo apt-get install packagename && sudo apt-get update
y sucederán automáticamente uno después del otro.sudo apt-get install packagename1 packagename2 packagename3
?Respuestas:
Puede usar el
aptdcon
comando para poner en cola las tareas del administrador de paquetes comunicándose con aptdaemon en lugar de usar apt-get directamente.Básicamente, puede hacer
sudo aptdcon --install chromium-browser
lo que sea y mientras se ejecuta ese comando, puede ejecutarlo nuevamente, pero instale diferentes paquetes y apt-daemon simplemente los pondrá en cola en lugar de generar errores.Esto es especialmente útil si está realizando una actualización larga o algo así y desea seguir instalando paquetes o si está creando una secuencia de comandos juntos y quiere asegurarse de que la instalación sea más confiable.
fuente
aptdcon
puede ejecutar de modo que acepte cualquier mensaje como loapt-get -y
hace?yes | aptdcon --hide-terminal --install "package"
Hide Terminal es necesario, de lo contrario, las tuberíasyes
causarán problemas.aptdcon
. Estoy trabajando en un script de arranque que realiza la configuración inicial de un VPS, donde un proceso en segundo plano también está haciendo una configuración inicial. No puedo instalaraptdcon
hasta que pueda evitar la cerradura.aptdcon
en?Puede
apt-get
aprender a esperar si se está ejecutando otro administrador de software. Algo similar con el comportamiento del próximo elenco de pantalla:¿Cómo lo hice?
Creo un nuevo script llamado
apt-get
(wrapper forapt-get
) en el/usr/local/sbin
directorio con el siguiente código bash dentro:No olvides hacerlo ejecutable:
Antes de realizar la prueba, verifique si todo está bien. La salida del
which apt-get
comando debería ser ahora/usr/local/sbin/apt-get
. El motivo es: de manera predeterminada, el/usr/local/sbin
directorio se coloca antes del/usr/bin
directorio en usuario o raízPATH
.fuente
apt
cosas en el arranque, por lo que midpkg
comando falló debido al bloqueo de dpkg db. He incluido esta línea en mis datos de usuario de cloudinit:while fuser /var/lib/dpkg/lock >/dev/null 2>&1; do sleep 1; done; dpkg -i package.deb
y funciona muy bien.Aparte de lo obvio
&&
, puede estar buscandoaptdcon
. Esta herramienta puede detectar otras instancias de apt y esperar a que finalicen:(Estoy corriendo aptitud en otro lugar)
La ventaja de esta herramienta es que puede almacenar varias acciones consecutivas sin preocuparse de lo que hará a continuación.
aptdcon
es ideal para scripts desatendidos e instalación de GUI, ya que puede permitir que la herramienta se ejecute en segundo plano para no bloquear su interfaz.Las operaciones soportadas por
aptdcon
son:--refresh
,-c
: Esto es equivalente aapt-get update
. Actualiza tu lista de paquetes.--install
`--remove
`--upgrade
`--purge
`--downgrade
. Cada uno de ellos hace lo que dicen sus nombres. El nombre del paquete (s) es obligatorio.-i
,-r
,-u
,-p
: Estas son las opciones cortos para todos excepto rebaja, que no tiene uno.--safe-upgrade
,--full-upgrade
son las contrapartes deapt-get
'supgrade
/dist-upgrade
yaptitude
' ssafe-upgrade
/full-upgrade
. Estos no necesitan parámetros.aptd
. Hay opciones que se superponen con lo queapt-key
,apt-cache
,dpkg
hacer.apt-get
en sí mismo no es compatible con dichos métodos (para esperar otras instancias de apt), por lo queaptdcon
es la solución preferida para los administradores de paquetes de GUI: USC usaaptd
como back-end, igual que Synaptic. Otra solución espackagekit
, pero no es compatible con la función que está buscando (todavía).fuente
aptdcon --install /path/to/pgk.deb
Funciona comodpkg -i
, aunque no pude encontrar esto explícitamente mencionado en el manual.Un enfoque muy simple sería un script que esperara a que el bloqueo no se abra. Vamos a llamarlo
waitforapt
y pegarlo/usr/local/bin
:Entonces solo corre
sudo waitforapt && sudo apt-get install whatever
. Puede agregar excepcionessudoers
para permitirle ejecutarlo sin necesidad de una contraseña (la necesitará paraapt-get
que no sea una gran ganancia).Lamentablemente, esto no pone en cola las cosas. Dado que algunas de las operaciones de apt son interactivas ("¡¿Estás seguro de que quieres eliminar todos esos paquetes ?!"), no puedo ver una buena forma de evitar esto ...
fuente
-y
asumir que sí para todas las operaciones?-y
embargo, no estoy seguro es deseable.sudo fuser
en[[ $(...) ]]
. Devuelve un código de salida cero cuando se accede al archivo, por lo que debería 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
Podría usar una técnica de sondeo:
fuente
inotify
Hice un script que hace esto:
Guarde lo anterior en
/usr/local/sbin/apt-get
.apt-get
luego esperará si ya se está ejecutando otra instancia.Alternativamente, guárdelo como
/usr/local/sbin/apt-wait
, ejemplo de uso:que se ejecutará
aptitude
después de que el proceso actual que mantiene el bloqueo haya salidofuente
inotify
Desafortunadamente, el fusor no hace mucho por usted cuando está ejecutando en diferentes contenedores de espacios de nombres sin privilegios como lxc.
Además, aptdcon no está instalado de manera predeterminada (al menos en 18.04) y pone en segundo plano su tarea en una cola para que pierda la serialización. Esto no es insuperable, pero significa que su automatización necesita tener alguna forma de evitar errores de flock en apt al instalar aptdcon, y necesitará tener algún tipo de bucles de espera para cualquier cosa que necesite serializar después de instalar paquetes a través de aptdcon a menos que ya haya algún tipo de bandera para eso.
Lo que funciona es rebaño. Esto también debería funcionar sobre NFS, etc., ya que utiliza el bloqueo del sistema de archivos de la misma manera que lo hace apt, solo con el parámetro -w segundos esperará en su bloqueo en lugar de arrojar un error.
Entonces, siguiendo el modelo de contenedor, agregue esto como apt-get in / usr / local / bin / y comparta.
Esto también tiene el beneficio de limitar IO al no permitir el paralelismo en apt para que pueda permitir que cron se active a medianoche en todas partes sin golpear el disco.
Una solicitud de función muy agradable y simple para apt-get sería una bandera -w para cambiar a un bloqueo / bloqueo de espera.
fuente
fuser
como se muestra en muchas respuestas, yafuser
que todavía es propenso a las condiciones de carrera entre ver el bloqueo y el proceso de destino agarrar el bloqueo nuevamente. Conflock
el bloqueo se adquiere y luego se pasa al proceso de destino, por lo que no deja tiempo para perder el bloqueo mientras tanto.One-liner basado en la respuesta de Oli :
fuente