64 votes

Comment faire attendre un gestionnaire de paquets si une autre instance d'APT est en cours d'exécution ?

J'ai vu de nombreux logiciels tels que Update Manager et Synaptic Package Manager, qui attendent qu'un autre programme utilise l'adresse IP. /var/lib/dpkg/lock et est verrouillé. Comment pouvons-nous faire cela par le biais du terminal ? J'ai vu apt-get mais je n'ai rien trouvé d'utile.

54voto

Radu Rădeanu Points 156862

Vous pouvez faire apt-get pour apprendre à attendre si un autre gestionnaire de logiciels est en cours d'exécution. Quelque chose de similaire avec le comportement du prochain screen cast :

enter image description here

Comment je l'ai fait ?

Je crée un nouveau script appelé apt-get (enveloppe pour apt-get ) en /usr/local/sbin avec le code bash suivant à l'intérieur :

#!/bin/bash

i=0
tput sc
while fuser /var/lib/dpkg/lock >/dev/null 2>&1 ; do
    case $(($i % 4)) in
        0 ) j="-" ;;
        1 ) j="\\" ;;
        2 ) j="|" ;;
        3 ) j="/" ;;
    esac
    tput rc
    echo -en "\r[$j] Waiting for other software managers to finish..." 
    sleep 0.5
    ((i=i+1))
done 

/usr/bin/apt-get "$@"

N'oubliez pas de le rendre exécutable :

sudo chmod +x /usr/local/sbin/apt-get

Avant de procéder au test, vérifiez que tout est en ordre. La sortie de which apt-get devrait être maintenant /usr/local/sbin/apt-get . La raison en est que, par défaut, le /usr/local/sbin est placé avant /usr/bin dans le répertoire utilisateur ou root PATH .

38voto

Joshua McKinnon Points 12379

Vous pouvez utiliser le site aptdcon commande Manpage icon pour mettre en file d'attente les tâches du gestionnaire de paquets en communiquant avec aptdaemon au lieu d'utiliser apt-get directement.

Donc en gros, vous pouvez juste faire sudo aptdcon --install chromium-browser ou autre, et pendant que cette commande est en cours d'exécution, vous pouvez la relancer mais installer des paquets différents et apt-daemon les mettra en file d'attente au lieu de se tromper.

C'est particulièrement utile si vous effectuez une longue mise à niveau ou autre et que vous voulez continuer à installer des paquets ou si vous créez un script et que vous voulez vous assurer que l'installation des choses sera plus fiable.

28voto

Mufaka Points 54

Une approche très simple serait un script qui attendrait que le verrou ne soit pas ouvert. Appelons-le waitforapt et le coller dans /usr/local/bin :

#!/bin/sh

while sudo fuser /var/{lib/{dpkg,apt/lists},cache/apt/archives}/lock >/dev/null 2>&1; do
   sleep 1
done

Ensuite, il suffit d'exécuter sudo waitforapt && sudo apt-get install whatever . Vous pourriez ajouter des exceptions dans sudoers pour vous permettre de l'exécuter sans avoir besoin d'un mot de passe (vous en aurez besoin pour l'interface de l'utilisateur). apt-get donc ce n'est pas un grand gain).

Malheureusement, cela ne met pas les choses en file d'attente. Étant donné que certaines des opérations d'apt sont interactives ("Êtes-vous sûr de vouloir supprimer tous ces paquets ? !"), je ne vois pas de bonne façon de contourner ce problème...

21voto

Braiam Points 64282

En dehors de l'évidence && vous recherchez peut-être aptdcon . Cet outil est capable de détecter d'autres instances d'apt et d'attendre qu'elles se terminent :

sudo aptdcon --safe-upgrade
\[/\]  11% **Waiting for other software managers to quit** Waiting for aptitude

(J'exécute aptitude ailleurs)

L'avantage de cet outil est que vous pouvez stocker plusieurs actions consécutivement sans vous soucier de ce que vous ferez ensuite. aptdcon est idéal pour les scripts sans surveillance, et l'installation de l'interface graphique, puisque vous pouvez permettre à l'outil de fonctionner en arrière-plan pour ne pas bloquer votre frontend.

Les opérations soutenues par aptdcon sont :

  • --refresh , -c : C'est l'équivalent de apt-get update . Il met à jour votre liste de paquets.
  • --install , --remove , --upgrade , --purge , --downgrade . Chacun d'entre eux fait ce que son nom indique. Le nom du ou des paquets est obligatoire. -i , -r , -u , -p : ce sont les options courtes pour tous, sauf pour le downgrade, qui n'en a pas.
  • --safe-upgrade , --full-upgrade sont les contreparties de apt-get 's upgrade / dist-upgrade y aptitude 's safe-upgrade / full-upgrade . Ceux-ci n'ont pas besoin de paramètres.
  • Il existe plusieurs autres opérations, qui peuvent être trouvées dans le manuel. Mais, celles-ci sont les plus utilisées par les utilisateurs intéressés à aptd . Il y a des options qui se chevauchent avec ce que apt-key , apt-cache , dpkg faire.

apt-get lui-même ne supporte pas de telles méthodes (pour attendre d'autres instances d'apt), donc aptdcon est la solution préférée aux gestionnaires de paquets des interfaces graphiques : USC utilise aptd comme back-end, comme pour Synaptic. L'autre solution est packagekit mais il ne prend pas en charge la fonction que vous recherchez (pour l'instant).

4voto

Menasheh Points 320

Une phrase basée sur Réponse d'Oli :

while sudo fuser /var/{lib/{dpkg,apt/lists},cache/apt/archives}/lock >/dev/null 2>&1; do sleep 1; done

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X