Ich habe viele Programme wie Update Manager und Synaptic Package Manager gesehen, die warten, bis ein anderes Programm das /var/lib/dpkg/lock
und verwendet und gesperrt ist. Wie können wir das über das Terminal tun? Ich habe apt-get
das Handbuch gesehen, aber nichts Nützliches gefunden.
command-line
apt
Piyush
quelle
quelle
sudo apt-get install packagename && sudo apt-get update
und sie werden automatisch nacheinander passieren.sudo apt-get install packagename1 packagename2 packagename3
:?Antworten:
Sie können den
aptdcon
Befehl verwenden , um Paketmanager-Tasks in die Warteschlange zu stellen, indem Sie mit aptdaemon kommunizieren, anstatt apt-get direkt zu verwenden.Im Grunde können Sie einfach etwas tun
sudo aptdcon --install chromium-browser
oder was auch immer, und während dieser Befehl ausgeführt wird, können Sie ihn erneut ausführen, aber verschiedene Pakete installieren, und apt-daemon wird sie einfach in die Warteschlange stellen, anstatt einen Fehler zu machen.Dies ist besonders nützlich, wenn Sie ein langes Upgrade oder etwas anderes durchführen und weiterhin Pakete installieren möchten oder wenn Sie gemeinsam Skripte erstellen und sicherstellen möchten, dass die Installation zuverlässiger ist.
quelle
aptdcon
so ausgeführt werden, dass Eingabeaufforderungen akzeptiert werdenapt-get -y
?yes | aptdcon --hide-terminal --install "package"
Hide Terminal wird benötigt, da sonstyes
Probleme mit der Verrohrung auftreten .aptdcon
. Ich arbeite an einem Bootstrap-Skript, das die Ersteinrichtung eines VPS durchführt, wobei ein Hintergrundprozess auch eine Ersteinrichtung vornimmt. Ich kann erst installieren,aptdcon
wenn ich das Schloss umgehen kann.aptdcon
?Sie können
apt-get
lernen, zu warten, wenn ein anderer Software-Manager ausgeführt wird. Ähnliches gilt für das Verhalten aus der nächsten Bildschirmdarstellung:Wie habe ich es gemacht?
Ich erstelle ein neues Skript namens
apt-get
(wrapper forapt-get
) im/usr/local/sbin
Verzeichnis mit dem folgenden Bash-Code:Vergiss nicht, es ausführbar zu machen:
Überprüfen Sie vor dem Testen, ob alles in Ordnung ist. Die Ausgabe des
which apt-get
Befehls sollte jetzt sein/usr/local/sbin/apt-get
. Der Grund ist: Standardmäßig steht das/usr/local/sbin
Verzeichnis vor dem/usr/bin
Verzeichnis in user oder rootPATH
.quelle
apt
beim Booten einige Aufgaben aus, sodass meindpkg
Befehl fehlgeschlagen ist, weil dpkg db gesperrt ist. Ich habe diesen Einzeiler in meine cloudinit-Benutzerdaten eingefügt:while fuser /var/lib/dpkg/lock >/dev/null 2>&1; do sleep 1; done; dpkg -i package.deb
und er funktioniert hervorragend.Abgesehen von dem Offensichtlichen
&&
, können Sie suchenaptdcon
. Dieses Tool kann andere Instanzen von apt erkennen und warten, bis sie beendet sind:(Ich renne aptitude woanders hin)
Der Vorteil dieses Tools besteht darin, dass Sie mehrere Aktionen nacheinander speichern können, ohne sich Gedanken darüber machen zu müssen, was Sie als Nächstes tun werden.
aptdcon
ist ideal für unbeaufsichtigte Skripte und die GUI-Installation, da Sie das Tool im Hintergrund ausführen lassen können, um Ihr Frontend nicht zu blockieren.Die von unterstützten Operationen
aptdcon
sind:--refresh
,-c
: Dies ist das Äquivalent zuapt-get update
. Es aktualisiert Ihre Paketliste.--install
,--remove
,--upgrade
,--purge
,--downgrade
. Jeder von ihnen tut, was sein Name sagt. Der Name des Pakets (der Pakete) ist obligatorisch.-i
,-r
,-u
,-p
Das sind die Short - Optionen für alle außer Herabstufung, der keinen hat.--safe-upgrade
,--full-upgrade
sind die Gegenstücke zuapt-get
'supgrade
/dist-upgrade
undaptitude
' ssafe-upgrade
/full-upgrade
. Diese benötigen keine Parameter.aptd
. Es gibt Optionen , die mit überlappen , wasapt-key
,apt-cache
,dpkg
zu tun.apt-get
selbst unterstützt solche Methoden nicht (um auf andere Instanzen von apt zu warten), daheraptdcon
ist dies die bevorzugte Lösung für die GUI-Paketmanager: USC verwendetaptd
dasselbe Back-End wie Synaptic. Eine andere Lösung istpackagekit
, aber sie unterstützt die gesuchte Funktion (noch) nicht.quelle
aptdcon --install /path/to/pgk.deb
Funktioniert sodpkg -i
, obwohl ich das nicht explizit im Handbuch finden konnte.Ein sehr einfacher Ansatz wäre ein Skript, das darauf wartet, dass das Schloss nicht geöffnet wird. Nennen wir es
waitforapt
und stecken es in/usr/local/bin
:Dann renn einfach
sudo waitforapt && sudo apt-get install whatever
. Sie können Ausnahmen hinzufügensudoers
, damit Sie es ausführen können, ohne ein Kennwort zu benötigen (Sie benötigen es für die,apt-get
so dass es kein großer Gewinn ist).Leider steht das nicht in der Warteschlange. Da einige Operationen von apt interaktiv sind ("Sind Sie sicher, dass Sie alle diese Pakete entfernen möchten ?!"), sehe ich keinen guten Weg, dies zu umgehen ...
quelle
-y
ja für alle operationen anzunehmen?-y
ist jedoch wünschenswert.sudo fuser
in[[ $(...) ]]
. Beim Zugriff auf die Datei wird ein Exit-Code von Null zurückgegeben, sodass dies ausreichen sollte.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
Sie können eine Abfragetechnik verwenden:
quelle
inotify
Ich habe ein Skript erstellt, das dies tut:
Speichern Sie die oben genannten in
/usr/local/sbin/apt-get
.apt-get
Wartet dann, ob bereits eine andere Instanz ausgeführt wird.Speichern Sie es alternativ als
/usr/local/sbin/apt-wait
Beispiel:Dies wird ausgeführt,
aptitude
nachdem der aktuelle Prozess, der die Sperre hält, beendet wurde.quelle
inotify
Leider leistet fuser nicht viel für Sie, wenn Sie in verschiedenen nicht privilegierten Namespace-Containern wie lxc arbeiten.
Außerdem ist aptdcon nicht standardmäßig installiert (mindestens am 18.04.) Und hinterlässt Ihre Aufgabe in einer Warteschlange, sodass Sie die Serialisierung verlieren. Dies ist nicht unüberwindbar, aber es bedeutet, dass Ihre Automatisierung bei der Installation von aptdcon einige Möglichkeiten haben muss, um Flockfehler in apt zu vermeiden, und dass Sie eine Art Warteschleife für alles benötigen, was Sie nach der Installation von Paketen über aptdcon serialisieren müssen es sei denn, es gibt bereits eine Art Flagge dafür.
Was funktioniert, ist Herde. Dies sollte auch über NFS usw. funktionieren, da die Dateisystemsperrung auf die gleiche Weise wie bei apt verwendet wird. Nur mit dem Parameter -w seconds wird auf Ihre Sperre gewartet, anstatt einen Fehler auszulösen.
Fügen Sie dies dem Wrapper-Modell folgend als apt-get in / usr / local / bin / hinzu und geben Sie es frei.
Dies hat auch den Vorteil, dass die Anzahl der E / A-Vorgänge begrenzt wird, da bei apt keine Parallelität zugelassen wird, sodass Sie Aktualisierungen von cron überall um Mitternacht auslösen können, ohne die Festplatte zu beschädigen.
Eine sehr nette und einfache Feature-Anfrage für apt-get wäre ein -w-Flag, um zu einer Blockierungs- / Wartesperre zu wechseln.
quelle
fuser
in vielen Antworten gezeigte, dafuser
es immer noch zu Wettlaufsituationen zwischen dem Beobachten der Sperre und dem erneuten Ergreifen der Sperre durch den Zielprozess kommt. Mitflock
der Sperre wird erfasst und dann an den Zielprozess übergeben, so dass keine Zeit mehr bleibt, die Sperre in der Zwischenzeit zu verlieren.Einzeiler basierend auf Olis Antwort :
quelle