J'ai vu de nombreux logiciels tels que Update Manager et Synaptic Package Manager, ils attendent si un autre programme utilise le /var/lib/dpkg/lock
et est verrouillé. Comment pouvons-nous faire cela par le terminal? J'ai vu apt-get
le manuel mais je n'ai rien trouvé d'utile.
command-line
apt
Piyush
la source
la source
sudo apt-get install packagename && sudo apt-get update
et ils vont se passer automatiquement les uns après les autres.sudo apt-get install packagename1 packagename2 packagename3
?Réponses:
Vous pouvez utiliser cette
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 simplement faire
sudo aptdcon --install chromium-browser
ce que vous voulez et tant que cette commande est en cours d'exécution, vous pouvez l'exécuter à nouveau, mais installer différents packages et apt-daemon les mettra en file d'attente au lieu de générer une erreur.Ceci est particulièrement utile si vous effectuez une longue mise à niveau ou quelque chose comme cela et que vous souhaitez continuer à installer des packages ou si vous écrivez quelque chose ensemble et que vous voulez vous assurer que l'installation sera plus fiable.
la source
aptdcon
être exécuté de telle sorte qu'il accepte les invites comme il leapt-get -y
fait?yes | aptdcon --hide-terminal --install "package"
Cacher le terminal est nécessaire, sinon la tuyauterieyes
causera des problèmes.aptdcon
. Je travaille sur un script d'amorçage qui effectue la configuration initiale d'un VPS, où un processus en arrière-plan effectue également une configuration initiale. Je ne peux pas installeraptdcon
avant de pouvoir contourner le verrou.aptdcon
?Vous pouvez
apt-get
apprendre à attendre si un autre gestionnaire de logiciel est en cours d'exécution. Quelque chose de similaire avec le comportement de la prochaine distribution d'écran:Comment je l'ai fait?
Je crée un nouveau script appelé
apt-get
(wrapper forapt-get
) dans le/usr/local/sbin
répertoire avec le code bash suivant:N'oubliez pas de le rendre exécutable:
Avant de tester, vérifiez si tout va bien. La sortie de
which apt-get
commande devrait être maintenant/usr/local/sbin/apt-get
. La raison est la suivante: par défaut, le/usr/local/sbin
répertoire est placé avant le/usr/bin
répertoire utilisateur ou rootPATH
.la source
apt
démarrage, madpkg
commande a donc échoué à cause du blocage de dpkg db. J'ai mis ce one-liner dans mes données utilisateur cloudinit:while fuser /var/lib/dpkg/lock >/dev/null 2>&1; do sleep 1; done; dpkg -i package.deb
et cela fonctionne très bien.En dehors de l'évidence
&&
, vous recherchez peut-êtreaptdcon
. Cet outil est capable de détecter d'autres instances d'apt et d'attendre qu'elles se terminent:(Je cours d'aptitude ailleurs)
L'avantage de cet outil est que vous pouvez stocker plusieurs actions de manière consécutive sans vous inquiéter de ce que vous ferez ensuite.
aptdcon
est idéal pour les scripts sans assistance et l’installation d’interface graphique, car vous pouvez autoriser l’exécution de l’outil en arrière-plan sans bloquer votre interface.Les opérations supportées par
aptdcon
sont:--refresh
,-c
: Ceci est l'équivalent deapt-get update
. Il met à jour votre liste de paquets.--install
,--remove
,--upgrade
,--purge
,--downgrade
. Chacun fait comme son nom l'indique. Le nom du ou des colis est obligatoire.-i
,-r
,-u
,-p
: Ce sont les options courtes pour tous , sauf révision à la baisse, qui ne l' ont pas.--safe-upgrade
,--full-upgrade
sont les contreparties deapt-get
'upgrade
/dist-upgrade
etaptitude
'safe-upgrade
/full-upgrade
. Ceux-ci n'ont pas besoin de paramètres.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), c'est doncaptdcon
la solution préférée par les gestionnaires de paquets de l'interface graphique: USC utiliseaptd
comme back-end, comme Synaptic. Une autre solution estpackagekit
, mais elle ne supporte pas la fonction que vous recherchez (pour le moment).la source
aptdcon --install /path/to/pgk.deb
Fonctionne commedpkg -i
, bien que je ne pouvais trouver ce explicitement mentionné dans le manuel.Une approche très simple serait un script qui attend que le verrou ne soit pas ouvert. Appelons-le
waitforapt
et collez-le dans/usr/local/bin
:Alors viens courir
sudo waitforapt && sudo apt-get install whatever
. Vous pouvez ajouter des exceptions danssudoers
pour vous permettre de l'exécuter sans avoir besoin d'un mot de passe (vous en aurez besoin pour le,apt-get
donc ce n'est pas un gros gain).Malheureusement, cela ne fait pas la queue. Étant donné que certaines opérations d'apt sont interactives ("Êtes-vous sûr de vouloir supprimer tous ces paquets?!"), Je ne vois pas comment contourner ce problème ...
la source
-y
supposer que oui pour toutes les opérations?-y
est souhaitable si.sudo fuser
dans[[ $(...) ]]
. Il renvoie un code de sortie zéro lors de l'accès au fichier, ce qui devrait suffire.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
Vous pouvez utiliser une technique d'interrogation:
la source
inotify
J'ai fait un script qui fait ceci:
Enregistrez ce qui précède dans
/usr/local/sbin/apt-get
.apt-get
attendra ensuite si une autre instance est déjà en cours d'exécution.Sinon, enregistrez-le sous un
/usr/local/sbin/apt-wait
exemple d'utilisation:qui s'exécutera
aptitude
après la fin du processus en cours contenant le verrou.la source
inotify
Malheureusement, fuser ne fait pas grand chose pour vous lorsque vous utilisez plusieurs conteneurs d’espace de noms non privilégiés comme lxc.
De plus, aptdcon n’est pas installé par défaut (au moins le 18.04) et met votre tâche en arrière-plan dans une file d’attente de sorte que vous perdiez la sérialisation. Ce n'est pas insurmontable, mais cela signifie que votre automatisation doit avoir un moyen d'éviter les erreurs de flock dans apt lors de l'installation d'aptdcon, et vous aurez besoin d'une sorte de boucle d'attente pour tout ce que vous devez sérialiser après avoir installé des paquets via aptdcon. à moins qu'il y ait une sorte de drapeau pour cela déjà.
Qu'est-ce que le travail est troupeau. Cela devrait également fonctionner sur NFS, etc., car il utilise le verrouillage du système de fichiers de la même façon qu'apt, mais avec le paramètre -w secondes, il attendra sur votre verrou au lieu de générer une erreur.
Donc, en suivant le modèle du wrapper, ajoutez ceci comme apt-get dans / usr / local / bin / et partagez-le.
Cela présente également l’avantage de limiter les entrées-sorties en interdisant le parallélisme sur apt, de sorte que vous pouvez laisser cron déclencher les mises à jour à minuit partout sans frapper le disque.
Une demande de fonctionnalité très simple et agréable pour apt-get serait un drapeau -w permettant de basculer vers un verrou bloquant / en attente.
la source
fuser
comme indiqué dans de nombreuses réponses, car ilfuser
reste sujet à des conditions de concurrence féroce entre l'observation du verrou et le processus cible qui saisit le verrou à nouveau. Avecflock
le verrou est acquis et ensuite passé au processus cible afin qu'il ne laisse pas de temps pour perdre le verrou dans l'intervalle.One-Liner basé sur la réponse d'Oli :
la source