Pesan error apt dan dpkg termasuk yang paling informatif di dunia Linux: hampir setiap pesan menyebut berkas atau paket yang bermasalah, alasannya, dan sering kali obatnya. Persoalannya, pesan itu muncul cepat, panjang, dan bertumpuk — pengguna panik cenderung menscroll sampai bawah lalu menebak. Chapter ini melatih kebiasaan sebaliknya: membaca pesan sampai habis, mengekstrak fakta pentingnya, lalu mengarahkannya ke perintah perbaikan yang tepat. Skenario per-skenario sudah dibedah di Chapter Troubleshooting Packages ; fokus kita sekarang adalah pola triase yang bisa dituliskan sebagai skrip.

Tabel Triase Error Umum #

Enam pesan berikut menutupi mayoritas kegagalan apt dan dpkg di lapangan:

PesanPenyebab khasPerintah perbaikan
Could not get lock ... held by processproses apt lain sedang berjalanps aux | grep apt, tunggu
dpkg: error processing packagetransaksi dpkg terputus di tengahsudo dpkg --configure -a
... but it is not going to be installedunmet dependenciessudo apt --fix-broken install
NO_PUBKEYkeyring repository kedaluwarsaperbarui keyring repo
does not have a Release fileentri repository usangsunting /etc/apt/sources.list
No space left on devicedisk penuh saat mengunduhkosongkan ruang — Chapter Disk Space Problems

Dua baris pertama tabel itu saling bersambung: transaksi yang terputus sering kali bermula dari apt yang berhenti setelah menemui error lain, sehingga perbaikan hampir selalu dimulai dari baris pesan paling atas.

Kasus 1: Lock Sedang Dipegang #

Pesan Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 3821 (apt) bukan berarti sistem rusak — pesan itu justru pengaman yang sedang bekerja, karena dua transaksi yang menulis database bersamaan akan saling merusak. Pelakunya biasanya unattended-upgrades yang memperbarui paket di latar belakang. Identifikasi pemegangnya dengan ps aux | grep apt, lalu tunggu sampai selesai.

Kasus 2: Transaksi Terputus dan Dependensi Rusak #

Skenario klasiknya: koneksi terputus atau terminal ditutup saat dpkg sedang membongkar paket. Sesi apt berikutnya menolak jalan — berikut contoh tampilan keluhan lengkapnya:

text
dpkg: error processing package nginx-full (--configure):
 installed nginx-full package post-installation script subprocess returned error exit status 1
 nginx-full depends on nginx-common (= 1.22.1-9) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

Urutan perbaikannya mengikuti luka yang dialami database: sudo dpkg --configure -a menyelesaikan paket yang setengah terpasang, lalu sudo apt --fix-broken install memasang dependensi yang hilang. Keduanya aman diulang — perintah pertama akan mengatakan tidak ada yang perlu dikonfigurasi bila semuanya sudah beres, dan perintah kedua menyertakan opsi simulasi -s bila kita ingin melihat rencananya lebih dulu.

Kasus 3: Repository Usang dan Kunci Kedaluwarsa #

Dua pesan dari pihak repository sering muncul berpasangan setelah sebuah mirror ditutup atau mirror berganti alamat: The repository '...' does not have a Release file. berarti alamat yang tercantum tidak lagi menayangkan rilis, sedangkan NO_PUBKEY berarti tanda tangan rilis tidak bisa diverifikasi karena kuncinya tidak dikenal. Perbaikannya menyangkut dua berkas: sunting /etc/apt/sources.list untuk alamat yang benar — formatnya didokumentasikan di sources.list(5) — lalu perbarui keyring untuk pembaruan tanda tangan.

Praktik: Mengekstrak Fakta dari Pesan #

Langkah pertama triase adalah mengambil fakta penting dari pesan mentah: siapa pemegang lock, paket mana yang rusak. Kita latih dengan fixture yang menampung lima pesan klasik:

bash
cat > error-apt.txt <<'AKHIR'
E: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 3821 (apt)
dpkg: error processing package nginx-full (--configure):
 nginx-full depends on nginx-common (= 1.22) but it is not going to be installed
W: GPG error: http://deb.debian.org/debian bookworm InRelease: NO_PUBKEY 4CBEDD5A9F92F8D6
E: You don't have enough free space in /var/cache/apt/archives/.
AKHIR
grep -o 'held by process [0-9]*' error-apt.txt
sed -n 's/^dpkg: error processing package \([a-z0-9.-]*\).*/paket bermasalah: \1/p' error-apt.txt

Output yang Dihasilkan:

text
held by process 3821
paket bermasalah: nginx-full

Dua perintah kecil itu menghasilkan dua fakta yang menentukan seluruh langkah berikutnya. Bedahnya:

  1. grep -o 'held by process [0-9]*': opsi -o mencetak hanya bagian yang cocok, sehingga nomor proses pemegang lock terpotong dari kalimat panjangnya — nomor itu langsung bisa dicocokkan dengan ps aux.
  2. sed -n 's/.../p' : substitusi dengan -n plus flag p mencetak hanya baris yang cocok pola dpkg: error processing package; tanda kurung \(...\) menangkap nama paket, lalu \1 menyalinnya ke keluaran.
  3. Pola [a-z0-9.-]*: nama paket Debian hanya memuat huruf kecil, angka, titik, dan tanda minus, jadi tangkapan berhenti tepat sebelum (--configure).

Praktik: Skrip Triage #

Fakta terkumpul, kini giliran pengarahannya. Skrip berikut membaca setiap baris pesan, lalu mencetak kategori masalah beserta perintah perbaikannya:

bash
cat > error-apt.txt <<'AKHIR'
E: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 3821 (apt)
dpkg: error processing package nginx-full (--configure):
 nginx-full depends on nginx-common (= 1.22) but it is not going to be installed
W: GPG error: http://deb.debian.org/debian bookworm InRelease: NO_PUBKEY 4CBEDD5A9F92F8D6
E: The repository 'http://deb.debian.org/debian bookworm Release' does not have a Release file.
E: You don't have enough free space in /var/cache/apt/archives/.
AKHIR
cat > triage-apt.sh <<'AKHIR'
#!/bin/bash
# Memetakan tiap baris pesan error apt ke langkah perbaikannya.
while IFS= read -r baris; do
  case "$baris" in
    *get*lock*)
      echo "LOCK -> ps aux | grep apt, tunggu prosesnya selesai";;
    *error*processing*package*)
      echo "DPKG -> sudo dpkg --configure -a";;
    *not*going*to*be*installed*)
      echo "DEP  -> sudo apt --fix-broken install";;
    *NO_PUBKEY*)
      echo "GPG  -> perbarui keyring repository";;
    *Release*file*)
      echo "REPO -> sunting /etc/apt/sources.list, entri sudah usang";;
    *free*space*)
      echo "DISK -> kosongkan ruang disk";;
  esac
done < error-apt.txt
AKHIR
bash triage-apt.sh

Output yang Dihasilkan:

text
LOCK -> ps aux | grep apt, tunggu prosesnya selesai
DPKG -> sudo dpkg --configure -a
DEP  -> sudo apt --fix-broken install
GPG  -> perbarui keyring repository
REPO -> sunting /etc/apt/sources.list, entri sudah usang
DISK -> kosongkan ruang disk

Enam baris pesan berubah menjadi enam baris rencana kerja — persis isi tabel triase di awal chapter. Bagian pentingnya:

  1. while IFS= read -r baris: membaca fixture baris demi baris; IFS= menjaga spasi di awal baris (baris ketiga fixture sengaja berindentasi) tetap terbaca utuh.
  2. case "$baris": satu tangan pola untuk tiap kategori; pola *get*lock* dan *Release*file* sengaja pendek agar variasi penulisan pesan tetap cocok.
  3. Tanpa tangan *): baris yang tidak dikenali tidak dicetak apa-apa — triase hanya boleh merekomendasikan perbaikan yang jelas sumbernya.

Skrip seperti ini biasanya diberi makan keluaran asli apt upgrade yang dialihkan ke berkas, bukan fixture — perintah-perintah lengkapnya didokumentasikan di apt-get(8) . Semua kategori di atas kecuali satu selesai dengan satu-dua perintah; sisanya, baris DISK, menuntut perburuan tersendiri di dalam filesystem. Perburuan itulah topik Chapter Disk Space Problems .