APT Lock — Xử lý tiến trình apt bị treo trên Linux
Triệu chứng
Khi chạy apt update hoặc các lệnh apt khác, hệ thống báo lỗi:
E: Could not get lock /var/lib/apt/lists/lock. It is held by process <PID> (apt-get)
N: Be aware that removing the lock file is not a solution and may break your system.
E: Unable to lock directory /var/lib/apt/lists/
Nguyên nhân
APT sử dụng file lock để ngăn nhiều tiến trình chạy đồng thời, tránh xung đột package database. Lock bị giữ khi:
- Một tiến trình
apt/dpkgđang chạy (update, install, upgrade...) - Tiến trình đã chết nhưng chưa giải phóng lock (crash, kill -9, mất điện...)
- Cron job chạy ngầm (
unattended-upgrades, script nội bộ...)
Chẩn đoán
Bước 1 — Xác định tiến trình đang giữ lock
PID thường được báo trực tiếp trong thông báo lỗi. Kiểm tra tiến trình đó:
ps -p <PID> -o pid,user,etime,cmd
Ví dụ output:
PID USER ELAPSED CMD
2851480 root 2-11:12:53 apt-get -qq -y update
Bước 2 — Xác định loại tiến trình
| Lệnh đang chạy | Mức độ nguy hiểm khi kill | Ghi chú |
|---|---|---|
apt-get update |
✅ Thấp | Chỉ sync metadata, không động package |
apt-get install |
⚠️ Trung bình | Cần cẩn thận, có thể cần dpkg --configure -a sau |
dpkg |
❌ Cao | Không kill nếu chưa chắc chắn |
Bước 3 — Xem tiến trình đã chạy bao lâu
ps -p <PID> -o pid,etime,cmd
Cột ELAPSED hiển thị theo định dạng D-HH:MM:SS.
Ngưỡng tham khảo:
| Thời gian chạy | Đánh giá |
|---|---|
| < 5 phút | Bình thường, nên chờ |
| 5 – 15 phút | Có thể chậm mạng, theo dõi thêm |
| > 15 phút | Nhiều khả năng bị stuck, cân nhắc kill |
| > 1 tiếng | Chắc chắn bị stuck, kill |
Bước 4 — Kiểm tra tiến trình còn sống không
kill -0 <PID> 2>&1
- Không có output → tiến trình còn sống
- Báo
No such process→ tiến trình đã chết, chỉ còn lock file thừa
Xử lý
Trường hợp 1 — Tiến trình còn sống và cần kill
Áp dụng khi: tiến trình bị stuck quá lâu (xem ngưỡng ở trên), hoặc là apt-get update.
sudo kill <PID> && sleep 2 \
&& sudo rm -f /var/lib/apt/lists/lock \
/var/lib/dpkg/lock \
/var/lib/dpkg/lock-frontend \
&& sudo apt update
Trường hợp 2 — Tiến trình đã chết, lock còn thừa
sudo rm -f /var/lib/apt/lists/lock \
/var/lib/dpkg/lock \
/var/lib/dpkg/lock-frontend
sudo dpkg --configure -a
sudo apt update
Trường hợp 3 — Không rõ ai đang chạy apt
Tìm tất cả tiến trình liên quan:
ps aux | grep -E 'apt|dpkg' | grep -v grep
Kiểm tra có cron job không:
grep -r 'apt\|dpkg' /etc/cron* /var/spool/cron/ 2>/dev/null
systemctl list-timers | grep -i apt
Lưu ý quan trọng
⚠️ Không xóa lock file khi tiến trình vẫn còn đang chạy. Phải kill tiến trình trước, xóa lock sau.
⚠️ Không dùng
kill -9trừ khikillthường không có tác dụng.kill -9không cho tiến trình dọn dẹp, có thể để lại trạng thái không nhất quán.ℹ️ Sau khi kill
apt-get installhoặcdpkg, luôn chạysudo dpkg --configure -ađể đảm bảo package database nhất quán.
Tham khảo nhanh
# Xem tiến trình giữ lock
ps -p <PID> -o pid,user,etime,cmd
# Kill và dọn lock (dành cho apt-get update bị stuck)
sudo kill <PID> && sleep 2 \
&& sudo rm -f /var/lib/apt/lists/lock /var/lib/dpkg/lock /var/lib/dpkg/lock-frontend \
&& sudo apt update
# Dọn lock khi tiến trình đã chết
sudo rm -f /var/lib/apt/lists/lock /var/lib/dpkg/lock /var/lib/dpkg/lock-frontend
sudo dpkg --configure -a && sudo apt update