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.
Réponses
Trop de publicités?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 :
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
.
Vous pouvez utiliser le site aptdcon
commande 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.
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...
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 deapt-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 deapt-get
'supgrade
/dist-upgrade
yaptitude
'ssafe-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 queapt-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).
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
- Réponses précédentes
- Plus de réponses