Saya telah melihat banyak software seperti Update Manager dan Synaptic Package Manager, mereka menunggu jika beberapa program lain menggunakan /var/lib/dpkg/lock
dan terkunci. Bagaimana kita bisa melakukan ini melalui Terminal? Saya melihat apt-get
manual tetapi tidak menemukan sesuatu yang bermanfaat.
command-line
apt
Piyush
sumber
sumber
sudo apt-get install packagename && sudo apt-get update
dan mereka akan terjadi secara otomatis setelah satu sama lain.sudo apt-get install packagename1 packagename2 packagename3
:?Jawaban:
Anda dapat menggunakan yang
aptdcon
perintah untuk mengantri tugas manajer paket dengan berkomunikasi dengan aptdaemon daripada menggunakan apt-get langsung.Jadi pada dasarnya Anda hanya dapat melakukan
sudo aptdcon --install chromium-browser
atau apa pun dan saat perintah itu berjalan Anda dapat menjalankannya lagi tetapi menginstal paket yang berbeda dan apt-daemon hanya akan mengantri mereka alih-alih kesalahan keluar.Ini sangat berguna jika Anda melakukan upgrade yang lama atau sesuatu dan ingin terus menginstal paket atau jika Anda membuat skrip sesuatu bersama-sama dan ingin memastikan bahwa menginstal sesuatu akan lebih dapat diandalkan.
sumber
aptdcon
dijalankan sedemikian rupa sehingga menerima konfirmasi apa pun sepertiapt-get -y
halnya?yes | aptdcon --hide-terminal --install "package"
Hide Terminal diperlukan, jika tidak perpipaanyes
akan menyebabkan masalah.aptdcon
. Saya sedang mengerjakan skrip bootstrap yang melakukan pengaturan awal VPS, di mana proses latar belakang melakukan beberapa pengaturan awal juga. Saya tidak dapat menginstalaptdcon
sampai saya dapat bekerja di sekitar kunci.aptdcon
di dalam?Anda dapat membuat
apt-get
belajar menunggu jika pengelola perangkat lunak lain berjalan. Sesuatu yang mirip dengan perilaku dari layar berikutnya:Bagaimana saya membuatnya?
Saya membuat skrip baru bernama
apt-get
(wrapper forapt-get
) dalam/usr/local/sbin
direktori dengan kode bash berikut di dalamnya:Jangan lupa untuk membuatnya dieksekusi:
Sebelum menguji, periksa apakah semuanya baik-baik saja. Output dari
which apt-get
perintah harus sekarang/usr/local/sbin/apt-get
. Alasannya adalah: secara default,/usr/local/sbin
direktori ditempatkan sebelum/usr/bin
direktori di pengguna atau rootPATH
.sumber
apt
hal saat boot, jadidpkg
perintah saya gagal karena terkunci dpkg db. Saya telah menempatkan satu-liner ini di data cloudinit user saya:while fuser /var/lib/dpkg/lock >/dev/null 2>&1; do sleep 1; done; dpkg -i package.deb
dan ini berfungsi dengan baik.Terlepas dari yang sudah jelas
&&
, Anda mungkin mencariaptdcon
. Alat ini dapat mendeteksi instance apt lainnya dan menunggu hingga selesai:(Saya menjalankan bakat di tempat lain)
Keuntungan dari alat ini adalah Anda dapat menyimpan beberapa tindakan secara berurutan tanpa khawatir dengan apa yang akan Anda lakukan selanjutnya.
aptdcon
sangat ideal untuk skrip yang tidak dijaga, dan pemasangan GUI, karena Anda dapat membiarkan alat berjalan di latar belakang agar tidak memblokir frontend Anda.Operasi yang didukung oleh
aptdcon
adalah:--refresh
,-c
: Ini setara denganapt-get update
. Ini memperbarui daftar paket Anda.--install
,--remove
,--upgrade
,--purge
,--downgrade
. Masing-masing dari mereka melakukan seperti namanya. Nama paket itu wajib.-i
,-r
,-u
,-p
: Ini adalah pilihan singkat untuk semua kecuali downgrade, yang tidak memiliki satu.--safe-upgrade
,--full-upgrade
Adalah rekan-rekan untukapt-get
'supgrade
/dist-upgrade
danaptitude
' ssafe-upgrade
/full-upgrade
. Ini tidak perlu parameter.aptd
. Ada pilihan yang tumpang tindih dengan apaapt-key
,apt-cache
,dpkg
lakukan.apt-get
itu sendiri tidak mendukung metode seperti itu (untuk menunggu contoh apt lainnya), jadiaptdcon
adalah solusi yang lebih disukai untuk manajer paket GUI: USC menggunakanaptd
sebagai back-end, sama seperti Synaptic. Solusi lain adalahpackagekit
, tetapi tidak mendukung fungsi yang Anda cari (belum).sumber
aptdcon --install /path/to/pgk.deb
Berfungsi sepertidpkg -i
, meskipun saya tidak dapat menemukan ini secara eksplisit disebutkan dalam manual.Pendekatan yang sangat sederhana adalah skrip yang menunggu kunci tidak terbuka. Sebut saja
waitforapt
dan masukkan/usr/local/bin
:Maka jalankan saja
sudo waitforapt && sudo apt-get install whatever
. Anda dapat menambahkan pengecualian ke dalamsudoers
untuk memungkinkan Anda menjalankannya tanpa perlu kata sandi (Anda akan membutuhkannya untukapt-get
itu sehingga tidak ada keuntungan besar).Sayangnya ini tidak mengantri. Mengingat beberapa operasi apt bersifat interaktif ("Apakah Anda yakin ingin menghapus semua paket itu ?!"), saya tidak dapat melihat cara yang baik untuk mengatasi ini ...
sumber
-y
untuk menganggap ya untuk semua operasi?-y
Meskipun tidak yakin diinginkan.sudo fuser
di[[ $(...) ]]
. Ini mengembalikan kode keluar nol ketika file sedang diakses sehingga harus memadai.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
Anda bisa menggunakan teknik polling:
sumber
inotify
Saya membuat skrip yang melakukan ini:
Simpan di atas ke dalam
/usr/local/sbin/apt-get
.apt-get
kemudian akan menunggu jika instance lain sudah berjalan.Atau, simpan sebagai
/usr/local/sbin/apt-wait
, contoh penggunaan:yang akan berjalan
aptitude
setelah proses saat memegang kunci telah keluar.sumber
inotify
Sayangnya fuser tidak banyak membantu Anda ketika Anda menjalankan berbagai wadah namespace yang tidak terjangkau seperti lxc.
Juga, aptdcon tidak diinstal secara default (setidaknya pada 18,04) dan latar belakang tugas Anda dalam antrian sehingga Anda kehilangan serialisasi. Ini tidak dapat diatasi, tetapi itu berarti otomasi Anda perlu memiliki beberapa cara untuk menghindari kesalahan kawanan di apt ketika menginstal aptdcon, dan Anda harus memiliki semacam loop menunggu untuk apa pun yang Anda butuhkan untuk membuat serialisasi setelah menginstal paket melalui aptdcon kecuali sudah ada semacam bendera untuk itu.
Apa yang berhasil adalah kawanan. Ini juga harus bekerja pada NFS dll karena menggunakan penguncian sistem file dengan cara yang sama dengan apt, hanya dengan parameter -w detik ia akan menunggu di kunci Anda alih-alih melemparkan kesalahan.
Jadi mengikuti model wrapper, tambahkan ini sebagai apt-get in / usr / local / bin / dan bagikan.
Ini juga memiliki manfaat membatasi IO dengan tidak mengizinkan paralelisme pada apt sehingga Anda dapat membiarkan cron memicu pembaruan di tengah malam di mana-mana tanpa mengalahkan disk.
Permintaan fitur yang sangat bagus dan sederhana untuk apt-get akan menjadi flag -w untuk beralih ke pemblokiran / kunci tunggu.
sumber
fuser
seperti yang ditunjukkan dalam banyak jawaban karenafuser
masih rentan terhadap kondisi balapan antara menonton kunci dan proses target meraih kunci lagi. Denganflock
kunci diperoleh dan kemudian diteruskan ke proses target sehingga tidak ada waktu untuk kehilangan kunci sementara itu.Satu kalimat berdasarkan jawaban Oli :
sumber