Widziałem wiele programów, takich jak Menedżer aktualizacji i Menedżer pakietów Synaptic, czekają, czy jakiś inny program używa /var/lib/dpkg/lock
i jest zablokowany. Jak możemy to zrobić za pośrednictwem terminalu? Widziałem apt-get
instrukcję, ale nie znalazłem nic przydatnego.
command-line
apt
Piyush
źródło
źródło
sudo apt-get install packagename && sudo apt-get update
i będą następować automatycznie po sobie.sudo apt-get install packagename1 packagename2 packagename3
:?Odpowiedzi:
Możesz użyć tego
aptdcon
polecenia, aby ustawić w kolejce zadania menedżera pakietów, komunikując się z aptdaemon, zamiast bezpośrednio używać apt-get.Zasadniczo możesz to zrobić
sudo aptdcon --install chromium-browser
lub cokolwiek, a podczas działania tego polecenia możesz je uruchomić ponownie, ale zainstaluj różne pakiety, a apt-daemon po prostu ustawi je w kolejce zamiast błędu.Jest to szczególnie przydatne, jeśli wykonujesz długą aktualizację lub coś takiego i chcesz nadal instalować pakiety lub jeśli tworzysz coś razem i chcesz mieć pewność, że instalacja będzie bardziej niezawodna.
źródło
aptdcon
można uruchomić tak, aby akceptował wszelkie monity, tak jakapt-get -y
robi?yes | aptdcon --hide-terminal --install "package"
Ukryj terminal jest potrzebny, w przeciwnym razie rurociągiyes
spowodują problemy.aptdcon
. Pracuję nad skryptem ładowania początkowego, który wykonuje początkową konfigurację VPS, w której proces w tle również wykonuje wstępną konfigurację. Nie mogę zainstalować,aptdcon
dopóki nie będę mógł obejść blokady.aptdcon
?Możesz
apt-get
nauczyć się czekać, jeśli działa inny menedżer oprogramowania. Coś podobnego do zachowania z następnej obsady ekranu:Jak to zrobiłem?
Tworzę nowy skrypt o nazwie
apt-get
(otoki dlaapt-get
) w/usr/local/sbin
katalogu z następującym kodem bash:Nie zapomnij, aby uczynić go wykonywalnym:
Przed przetestowaniem sprawdź, czy wszystko jest w porządku. Wyjście
which apt-get
polecenia powinno być teraz/usr/local/sbin/apt-get
. Powodem jest: domyślnie/usr/local/sbin
katalog jest umieszczony przed/usr/bin
katalogiem użytkownika lub użytkownika rootPATH
.źródło
apt
rzeczy podczas uruchamiania, więc mojedpkg
polecenie nie powiodło się z powodu zablokowanego dbkg db. Umieściłem ten jeden wiersz w moich danych użytkownika cloudinit:while fuser /var/lib/dpkg/lock >/dev/null 2>&1; do sleep 1; done; dpkg -i package.deb
i działa świetnie.Oprócz tego
&&
, czego możesz szukaćaptdcon
. To narzędzie jest w stanie wykryć inne przypadki apt i poczekać, aż zakończą:(Prowadzę aptitude gdzie indziej)
Zaletą tego narzędzia jest to, że możesz przechowywać kilka działań kolejno, nie martwiąc się tym, co będziesz robić dalej.
aptdcon
jest idealny do skryptów nienadzorowanych i instalacji GUI, ponieważ możesz pozwolić narzędziu działać w tle, aby nie blokować interfejsu użytkownika.Obsługiwane operacje
aptdcon
to:--refresh
,-c
: Jest to odpowiednikapt-get update
. Aktualizuje listę pakietów.--install
,--remove
,--upgrade
,--purge
,--downgrade
. Każdy z nich robi, jak mówią ich imiona. Nazwa paczki jest obowiązkowa.-i
,-r
,-u
,-p
: Są to krótkie opcje dla wszystkich z wyjątkiem obniżenia, którzy nie mają.--safe-upgrade
,--full-upgrade
są odpowiednikamiapt-get
„supgrade
/dist-upgrade
iaptitude
” ssafe-upgrade
/full-upgrade
. Te nie wymagają parametrów.aptd
. Istnieją opcje, które pokrywają się z tym, coapt-key
,apt-cache
,dpkg
zrobić.apt-get
sam nie obsługuje takich metod (czekania na inne instancje apt), więcaptdcon
jest preferowanym rozwiązaniem dla menedżerów pakietów GUI: USC używaaptd
jako zaplecza, tak samo jak Synaptic. Innym rozwiązaniem jestpackagekit
, ale nie obsługuje funkcji, której szukasz (jeszcze).źródło
aptdcon --install /path/to/pgk.deb
Działa podobniedpkg -i
, chociaż nie znalazłem tego wyraźnie wspomnianego w instrukcji.Bardzo prostym podejściem byłby skrypt, który czekał, aż zamek nie zostanie otwarty. Nazwijmy to
waitforapt
i wklejmy/usr/local/bin
:Więc po prostu biegnij
sudo waitforapt && sudo apt-get install whatever
. Możesz dodać wyjątki,sudoers
aby umożliwić Ci uruchomienie go bez potrzeby podawania hasła (będziesz go potrzebować,apt-get
więc nie będzie to wielki zysk).Niestety nie powoduje to kolejkowania. Biorąc pod uwagę, że niektóre operacje apt są interaktywne („Czy na pewno chcesz usunąć wszystkie te pakiety ?!”), nie widzę dobrego sposobu na obejście tego ...
źródło
-y
założyć tak dla wszystkich operacji?-y
jest to jednak pożądane.sudo fuser
w[[ $(...) ]]
. Zwraca zerowy kod wyjścia podczas dostępu do pliku, więc powinno to wystarczyć.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
Możesz użyć techniki odpytywania:
źródło
inotify
Stworzyłem skrypt, który to robi:
Zapisz powyższe w
/usr/local/sbin/apt-get
.apt-get
będzie wtedy czekać, jeśli inna instancja już działa.Możesz też zapisać jako
/usr/local/sbin/apt-wait
przykładowe użycie:który będzie działał
aptitude
po wyjściu bieżącego procesu z blokadą.źródło
inotify
Niestety fuser nie robi wiele dla ciebie, gdy pracujesz w różnych nieuprzywilejowanych kontenerach przestrzeni nazw, takich jak lxc.
Ponadto aptdcon nie jest domyślnie instalowany (przynajmniej 18.04) i ustawia zadania w tle w kolejce, co powoduje utratę serializacji. Nie jest to nie do pokonania, ale oznacza to, że twoja automatyzacja musi mieć jakiś sposób, aby uniknąć błędów kłaczków w apt podczas instalacji aptdcon, i będziesz musiał mieć jakieś pętle oczekiwania na wszystko, co potrzebujesz do serializacji po zainstalowaniu pakietów przez aptdcon chyba że istnieje już jakaś flaga.
To, co działa, to stado. Powinno to również działać w systemie plików NFS itp., Ponieważ korzysta on z blokowania systemu plików w taki sam sposób, jak apt, tylko z parametrem -w sekund będzie czekać na blokadę zamiast zgłaszać błąd.
Więc zgodnie z modelem otoki, dodaj to jako apt-get w / usr / local / bin / i udostępnij.
Ma to również tę zaletę, że ogranicza IO, ponieważ nie pozwala na równoległość apt, dzięki czemu możesz pozwolić cronowi na uruchamianie aktualizacji o północy wszędzie bez przyspieszania dysku.
Bardzo ładną i prostą prośbą o funkcję dla apt-get byłaby flaga -w, aby przełączyć się na blokowanie / blokowanie oczekiwania.
źródło
fuser
jak pokazano w wielu odpowiedziach, ponieważfuser
nadal jest podatny na warunki wyścigowe między oglądaniem zamka a procesem docelowym chwytania zamka ponownie. Zflock
blokadą jest pobierany, a następnie przekazywany do procesu docelowego, więc nie pozostawia czasu na utratę blokady w międzyczasie.One-liner oparty na odpowiedzi Oli :
źródło