Yeni kurulmuş bir Ubuntu sunucusuna bağlanıp sudo apt install nginx yazıyorsunuz ve daha ilk saniyede duruyorsunuz:
E: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 1487 (unattended-upgr)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
Arama motorunda çıkan ilk sonuçların neredeyse tamamı aynı şeyi söyler: kilit dosyalarını rm ile silin, sonra devam edin. Bu tavsiye çoğu zaman "işe yarar" görünür; komut geçer, paket kurulur, siz yolunuza devam edersiniz. Sorun, iki hafta sonra hiç ilgisiz bir güncellemede dpkg: error processing package ... hatalarının başlaması ve kimsenin bunu o gece silinen kilit dosyasıyla ilişkilendirmemesidir.
Bu yazıda önce kilidin ne işe yaradığını ve neden bilinçli bir güvenlik önlemi olduğunu göreceğiz. Ardından doğru sırayı uygulayacağız: kilidi kim tutuyor, ne kadar beklemek gerekir, süreç gerçekten donduysa nasıl sonlandırılır, yarım kalan işlem nasıl tamamlanır. Kilit dosyalarını silmek de var, ama en sonda ve şartlarıyla birlikte.
Hangi Kilit Dosyası, Neyi Koruyor?#
Hata mesajındaki dosya adı, sorunun hangi aşamada olduğunu doğrudan söyler. Sistemde tek bir kilit yoktur; farklı işleri koruyan dört ayrı dosya vardır.
| Dosya | Kimin kilidi | Ne zaman tutulur |
|---|---|---|
/var/lib/dpkg/lock-frontend | apt, aptitude, synaptic gibi ön yüzler | Paket kurma, kaldırma, yükseltme boyunca |
/var/lib/dpkg/lock | dpkg'nin kendisi | Paket veritabanına yazma anında |
/var/cache/apt/archives/lock | İndirme önbelleği | .deb dosyaları indirilirken |
/var/lib/apt/lists/lock | Depo listesi | apt update sırasında |
Bu dosyalar birer bayrak değildir; içerikleri boştur. Çekirdek düzeyinde bir danışma kilidi (advisory lock) tutarlar. Yani süreç dosyayı açar ve üzerine kilit koyar; kilidi tutan şey dosyanın varlığı değil, o dosyayı açık tutan sürecin kendisidir. Bunun pratik sonucu şudur: dosyayı silseniz bile kilit gerçekte kalkmaz, yalnızca ikinci sürecin kilidi görmesi engellenmiş olur. İki dpkg aynı anda aynı veritabanına yazmaya başlar.
lock-frontend dosyası, kullanıcıya soru soran ön yüzlerin birbirini ezmemesi için sonradan eklenmiştir. Gördüğünüz hata genellikle budur ve iyi haberdir: paket veritabanına henüz dokunulmamış, sadece sıra beklenmektedir.
"Lock Dosyasını Sil" Tavsiyesi Neden Paket Veritabanını Bozar?#
Bir paketin kurulumu tek adımlı değildir. dpkg önce arşivi açar (unpack), sonra yapılandırma betiklerini çalıştırır (configure), en sonda /var/lib/dpkg/status dosyasındaki kaydı günceller. Bu üç adım arasında paket "yarım" bir durumdadır ve kilit tam olarak bu aralığı korur.
Kilidi silip ikinci bir apt başlattığınızda üç şey aynı anda olabilir:
- İki süreç
/var/lib/dpkg/statusdosyasına aynı anda yazar. Bu dosya tüm paketlerin durumunu tutan düz metin veritabanıdır; bozulduğunda sistem hangi paketin kurulu olduğunu bilemez hâle gelir. - Bir paketin
postinstbetiği yarıda kesilirken diğeri aynı dosyaları değiştirir. Servis dosyaları, yapılandırma dosyaları ve sembolik bağlar tutarsız kalır. /var/lib/dpkg/updates/altındaki bekleyen durum kayıtları eksik işlenir; sonraki heraptçağrısı bu kalıntıyı yeniden oynatmaya çalışır.
Sonuç hemen görünmez. Genellikle haftalar sonra, tamamen ilgisiz bir pakette dpkg: error processing package ya da Errors were encountered while processing satırlarıyla ortaya çıkar. Bu yüzden kilit hatasında ilk refleks silmek değil, kimin tuttuğunu öğrenmek olmalıdır.
Adım 1: Kilidi Tutan Süreci Bulun#
Modern apt sürümleri süreç kimliğini ve adını doğrudan hata mesajında verir. Vermediyse üç komuttan biri yeterlidir:
sudo fuser -v /var/lib/dpkg/lock-frontend
sudo lsof /var/lib/dpkg/lock-frontend
ps -eo pid,ppid,stat,etime,cmd | grep -E 'apt|dpkg|unattended' | grep -v grep
ps çıktısındaki etime sütunu, sürecin ne kadar süredir çalıştığını gösterir. Bu tek bilgi, bekleyip beklememeniz gerektiğini büyük ölçüde belirler: iki dakikalık bir süreç normaldir, kırk dakikalıksa incelemeye değer.
Karşınıza çıkacak isimler ve anlamları:
unattended-upgr: Otomatik güvenlik güncellemeleri çalışıyor. En sık görülen ve en zararsız durumdur.apt-get/aptitude/packagekitd: Başka bir oturumda ya da bir masaüstü aracıyla açılmış bir işlem. İkinci bir SSH oturumu açık bıraktıysanız oradadır.dpkg: Paket veritabanına yazma aşamasındasınız. Burada kesinlikle müdahale etmeyin.
Sistemin bunu kendi kendine yaptığını görmek isterseniz zamanlayıcılara bakın:
systemctl list-timers 'apt-*'
systemctl status unattended-upgrades.service apt-daily.service apt-daily-upgrade.service
apt-daily.service depo listelerini ve paketleri indirir, apt-daily-upgrade.service ise kurulumu yapar. İkisi de rastgele bir gecikmeyle tetiklenir; tam siz bağlandığınızda çalışıyor olması tesadüf değil, tasarımın parçasıdır. Bu mekanizmanın ayarları için unattended-upgrades ile otomatik güncelleme yazısına bakabilirsiniz.
Adım 2: Beklemek — Neredeyse Her Zaman Doğru Cevap#
Otomatik güncelleme işlemleri tipik olarak birkaç dakikada biter. Kilidin serbest kalmasını izlemek için beklemeyi otomatikleştirebilirsiniz:
while sudo fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do
echo "kilit hala tutuluyor, 5 sn sonra tekrar bakilacak..."
sleep 5
done
echo "kilit serbest"
Daha temizi, apt'ye beklemesini söylemektir. Ubuntu 20.04 ve sonrasındaki apt sürümleri bunun için hazır bir seçenek taşır:
sudo apt -o DPkg::Lock::Timeout=300 install nginx
Bu komut, kilit meşgulse hata vermek yerine 300 saniyeye kadar bekler. Değeri -1 yaparsanız süresiz bekler. Sunucularda bunu kalıcı hâle getirmek, ekiplerin en sık düştüğü tuzağı doğrudan ortadan kaldırır:
echo 'DPkg::Lock::Timeout "300";' | sudo tee /etc/apt/apt.conf.d/80-kilit-bekleme
Otomasyon betiklerinizde ve dağıtım hatlarınızda bu ayarı yapmak, kilit hatası yüzünden yarıda kalan kurulumları neredeyse tamamen bitirir. APT'nin genel kullanımı ve seçenek dosyaları için Ubuntu ve Debian'da APT paket yönetimi yazısı iyi bir başlangıçtır.
Adım 3: Süreç Gerçekten Donduysa Nasıl Sonlandırılır?#
Bir süreç yarım saati aşmışsa ve ilerlemiyorsa gerçekten takılmış olabilir. Önce ilerleyip ilerlemediğinden emin olun; ağ üzerinden büyük bir paket indirmek uzun sürebilir:
sudo tail -n 20 /var/log/apt/term.log
sudo tail -n 20 /var/log/unattended-upgrades/unattended-upgrades.log
Log dosyasına hâlâ satır düşüyorsa iş devam ediyordur, dokunmayın. Gerçekten donmuşsa sıra şudur ve kill -9 bu sıranın hiçbir yerinde yoktur:
# 1) Yeni otomatik calistirmalari durdur
sudo systemctl stop apt-daily.timer apt-daily-upgrade.timer
# 2) Sureci nazikce sonlandir (SIGTERM), temizlenmesi icin sure taniyin
sudo systemctl stop unattended-upgrades.service
sudo kill 1487
# 3) Gercekten cikti mi kontrol edin
ps -p 1487
kill -9 yani SIGKILL, sürece temizlenme şansı vermez. dpkg tam da veritabanını yazarken öldürülürse, insanların "lock dosyasını sildim, sistem bozuldu" diye anlattığı tablo asıl burada oluşur. SIGTERM ile gönderilen istek dpkg'nin mevcut adımı bitirip düzgün çıkmasına imkân tanır.
Süreç D durumundaysa (kesintisiz uyku, ps çıktısındaki STAT sütunu) hiçbir sinyal işe yaramaz; bu genellikle disk ya da ağ dosya sistemi kaynaklıdır. Öncelikle disk doluluğunu kontrol edin, çünkü / ya da /var dolduğunda dpkg tam ortada asılı kalır. Bu konuda disk dolu hatası çözümü yazısındaki adımlar doğrudan uygulanabilir.
Adım 4: Yarım Kalan İşlemi Tamamlayın#
Kilit serbest kaldıktan sonra apt sizi çoğu zaman şu mesajla karşılar:
E: dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem.
Bu, veritabanının bozulduğu anlamına gelmez; açılmış ama yapılandırılmamış paketler olduğu anlamına gelir. Önce durumu görün:
sudo dpkg --audit
dpkg -l | awk '$1 != "ii" && NR > 5 {print $1, $2}'
dpkg -l çıktısındaki iki harfli durum kodları tam olarak nerede kaldığınızı söyler:
| Kod | Anlamı | Ne yapmalı |
|---|---|---|
ii | Kurulu ve yapılandırılmış | Sorun yok |
iU | Açılmış, yapılandırma bekliyor | dpkg --configure -a |
iF | Yapılandırma yarıda kalmış | dpkg --configure -a |
iH | Kurulum yarıda kalmış | apt --fix-broken install |
rc | Kaldırılmış, ayar dosyaları duruyor | Gerekirse apt purge |
Ardından yarım kalanları tamamlayın:
sudo dpkg --configure -a
Bu komut kullanıcıya soru soran bir yapılandırma ekranında takılabilir. Otomasyon içindeyseniz etkileşimi kapatın:
sudo DEBIAN_FRONTEND=noninteractive dpkg --configure -a
Komut bir hata verirse mesajı okumadan ilerlemeyin. En sık iki neden vardır: disk dolmuştur ya da bir servis başlatılamadığı için postinst betiği başarısız olmuştur. Her ikisi de asıl sorunun kendisidir; paketle ilgisi yoktur.
Adım 5: Bağımlılıkları Onarın#
Yarıda kesilen bir işlem geride eksik bağımlılıklar bırakmış olabilir. Unmet dependencies ya da You have held broken packages mesajlarının kaynağı budur:
sudo apt --fix-broken install
sudo apt update
sudo apt full-upgrade
--fix-broken install, eksik bağımlılıkları tespit edip kurmayı dener ve vakaların çoğunu tek başına kapatır. Çözemezse hangi paketin zinciri kırdığını görün:
sudo apt-get check
apt-cache policy sorunlu-paket
Bir uyarı: internette sıkça önerilen dpkg --force-all ve --force-overwrite bayrakları bağımlılık denetimini tamamen atlar. Anlık olarak sorunu çözmüş gibi görünürler, gerçekte tutarsızlığı sisteme kalıcı olarak yazarlar. Üretim sunucusunda bunlara başvurmadan önce anlık görüntü ya da yedek alın.
Son Çare: Kilit Dosyalarını Silmek ve Şartları#
Buraya ancak yukarıdaki adımların tamamı denendikten sonra gelinir. Silme işlemi yalnızca hiçbir sürecin kilidi tutmadığı, buna rağmen dosyaların ortada kaldığı durumda anlamlıdır; bu genellikle sunucunun bir güncelleme sırasında sert biçimde kapanmasından sonra görülür.
Kontrol listesi, sırayla:
sudo fuser -v /var/lib/dpkg/lock-frontend /var/lib/dpkg/lockhiçbir süreç göstermemeli.ps -e | grep -E 'apt|dpkg'boş dönmeli.sudo systemctl stop apt-daily.timer apt-daily-upgrade.timerile yeni tetiklenmeler durdurulmalı.- Sanallaştırma katmanınızda anlık görüntü alınmalı ya da en azından
/var/lib/dpkg/dizini kopyalanmalı.
Ancak bundan sonra:
sudo cp -a /var/lib/dpkg/status /root/dpkg-status.yedek
sudo rm -f /var/lib/dpkg/lock-frontend /var/lib/dpkg/lock
sudo rm -f /var/cache/apt/archives/lock /var/lib/apt/lists/lock
sudo dpkg --configure -a
sudo apt --fix-broken install
sudo systemctl start apt-daily.timer apt-daily-upgrade.timer
Silme işleminden sonra dpkg --configure -a çalıştırmak isteğe bağlı değildir; kilit ortada kaldıysa büyük olasılıkla yarım kalmış bir işlem de vardır.
status dosyası gerçekten bozulduysa (dpkg okurken sözdizimi hatası veriyorsa) sistem her gün otomatik yedek alır. Kurtarma şöyledir:
ls -l /var/backups/dpkg.status.*
sudo cp /var/lib/dpkg/status /root/dpkg-status.bozuk
sudo zcat /var/backups/dpkg.status.0.gz | sudo tee /var/lib/dpkg/status > /dev/null
sudo dpkg --configure -a
Yedek bir gün öncesine ait olabileceği için aradaki değişiklikler kaybolur; apt update ve apt full-upgrade ile fark kapatılır.
Kilit Gibi Görünen Ama Kilit Olmayan Üç Durum#
Hata metninde "lock" kelimesi geçtiği için hepsi aynı sorun sanılır, oysa üç farklı arıza aynı başlıkla karşınıza çıkar ve çözümleri birbirine hiç benzemez.
Yetki hatası. Mesajın sonundaki parantez içi kod belirleyicidir:
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock, are you root?
13: Permission denied bir çakışma değildir; komutu sudo olmadan çalıştırmışsınızdır. Buna karşılık gerçek çakışmanın kodu 11: Resource temporarily unavailable'dır. Bu iki sayıyı ayırt etmek, gereksiz yere süreç aramaktan kurtarır.
Yalnızca depo listesi kilidi. Hata /var/lib/apt/lists/lock diyorsa paket veritabanına hiç dokunulmamıştır; başka bir yerde sadece apt update çalışıyordur. Birkaç saniye bekleyip tekrar denemek yeterlidir, dpkg --configure -a gerekmez.
Salt okunur dosya sistemi. Disk hatası sonrası çekirdek bölümü salt okunur kipe alır ve kilit dosyası hiç oluşturulamaz:
mount | grep ' / '
sudo dmesg -T | grep -iE 'read-only|I/O error' | tail
Çıktıda ro görüyorsanız burada bir paket sorunu yoktur; disk ya da dosya sistemi arızası vardır. Kilit dosyalarını silmeye çalışmak zaten mümkün olmaz.
| Mesajdaki ipucu | Gerçek sorun | Doğru hamle |
|---|---|---|
11: Resource temporarily unavailable | Başka bir apt/dpkg süreci | Süreci bul, bekle |
13: Permission denied | Yetki eksik | Komutu sudo ile çalıştır |
/var/lib/apt/lists/lock | Eşzamanlı apt update | Birkaç saniye bekle |
Read-only file system | Disk veya dosya sistemi arızası | dmesg ve disk denetimi |
Bu Hatayı Bir Daha Yaşamamak İçin#
Kilit hatası bir arıza değil, eşzamanlılık göstergesidir. Kalıcı çözüm de eşzamanlılığı yönetmekten geçer.
- Bekleme süresini varsayılan yapın. Yukarıdaki
80-kilit-beklemedosyası hem elle çalıştırdığınız komutları hem de otomasyonu kapsar. - Otomatik güncellemeleri saat olarak sabitleyin. Kritik sunucularda
apt-daily-upgrade.timerbiriminin tetikleme aralığını bakım pencerenize taşımak, gündüz çakışmalarını bitirir. - Aynı sunucuda iki oturumda birden apt çalıştırmayın. Ekipçe çalışıyorsanız bakım öncesi kısa bir duyuru, saatlerce süren teşhisten ucuzdur.
- Etkileşimli sorulara hazırlıklı olun. Ubuntu 22.04 ve sonrasında
needrestartaracı kurulum sonunda servis yeniden başlatma ekranı açar; betiklerdeDEBIAN_FRONTEND=noninteractivekullanmak beklemeyi önler. - Disk doluluğunu izleyin. Kilit hatalarının azımsanmayacak bir kısmı, aslında
/varbölümünün dolmasıyla asılı kalan bir dpkg sürecidir.
Sürüm yükseltmesi gibi uzun süren işlemlerde otomatik güncelleme servislerini geçici olarak durdurmak da meşru bir yöntemdir; ayrıntılar için Ubuntu LTS sürüm yükseltme yazısına bakabilirsiniz.
Sıkça Sorulan Sorular#
Kilit dosyasını silmek gerçekten zararlı mı, birçok kaynak öneriyor?#
Kilit dosyası bir bayrak değil, çekirdek düzeyinde tutulan bir danışma kilididir. Dosyayı silmek kilidi kaldırmaz; yalnızca ikinci sürecin kilidi görmesini engeller. Kilidi tutan bir işlem hâlâ çalışıyorken bunu yaparsanız iki dpkg süreci aynı paket veritabanına yazar ve tutarsızlık kalıcı olur. Hiçbir süreç kalmadığı doğrulandıktan sonra silmek ise güvenlidir; dosyalar bir sonraki çalıştırmada yeniden oluşturulur.
Kilidin serbest kalmasını ne kadar beklemeliyim?#
Otomatik güvenlik güncellemeleri genellikle iki ila on dakika arasında biter. ps çıktısındaki etime sütunuyla sürecin yaşını ve /var/log/apt/term.log dosyasına satır düşüp düşmediğini kontrol edin. Log ilerliyorsa iş devam ediyordur ve beklemek doğrudur. Yarım saati aşan ve hiç ilerlemeyen bir süreç için ise önce nazik sonlandırma, ardından yarım kalan işlemin tamamlanması gerekir.
dpkg --configure -a tam olarak ne yapar?#
Arşivi açılmış ama yapılandırma adımı tamamlanmamış paketleri bulur ve yapılandırma betiklerini yeniden çalıştırır. Yarıda kesilen bir kurulumdan sonra paketler kurulu görünür fakat çalışmaz; bu komut aradaki boşluğu kapatır. Veri silmez ve kurulu paketleri kaldırmaz, bu yüzden kilit sorunundan sonra çalıştırılması güvenlidir. Hata verirse mesajı okuyun; genellikle disk doluluğu ya da başlatılamayan bir servis işaret edilir.
apt --fix-broken install ile dpkg --configure -a arasındaki fark nedir?#
dpkg --configure -a yalnızca zaten sistemde olan yarım paketleri yapılandırır; yeni bir şey indirmez. apt --fix-broken install ise bağımlılık zincirine bakar, eksik paketleri depodan indirip kurar ve gerekirse çakışanları kaldırmayı önerir. Doğru sıra önce yapılandırma, sonra bağımlılık onarımıdır; çünkü yapılandırılmamış paketler bağımlılık çözümlemesini de yanıltır.
Aynı hata AlmaLinux veya Rocky Linux'ta da olur mu?#
Doğrudan aynı dosyalar değil, ancak eşdeğeri olur. RHEL ailesinde paket yöneticisi dnf'tir ve kilidini /var/lib/rpm/.rpm.lock ile /var/cache/dnf altında tutar; hata mesajı genellikle başka bir uygulamanın yum ya da dnf kilidini tuttuğunu söyler. Çözüm mantığı birebir aynıdır: kilidi tutan süreci bulun, bitmesini bekleyin, gerekirse dnf check ile tutarlılığı doğrulayın. Karşılaştırma için AlmaLinux ve Rocky'de dnf paket yönetimi yazısına göz atabilirsiniz.
Sunucumda bu hatayı hiç görmemek için otomatik güncellemeleri kapatmalı mıyım?#
Kapatmak yerine zamanlamak daha doğrudur. Güvenlik güncellemelerini tamamen devre dışı bırakmak, kilit sorunundan çok daha büyük bir riski kabul etmek anlamına gelir. Bakım penceresi tanımlayın, apt için kilit bekleme süresini yapılandırın ve otomasyon betiklerinizde etkileşimsiz kipi kullanın. Böylece hem güncellemeler kesintisiz sürer hem de elle çalıştırdığınız komutlar hata vermek yerine sıraya girer.