Logo

Personal Ops Runbook

Personal runbook covering infrastructure operations for Cloud, Kubernetes, OpenStack, and Ceph environments. Includes deployment and teardown procedures, node management, cluster monitoring setup, and incident response workflows compiled from day-to-day operational work. Intended strictly for personal reference — configurations and scripts are environment-specific and not guaranteed to work as-is elsewhere.

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 -9 trừ khi kill thường không có tác dụng. kill -9 khô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 install hoặc dpkg, luôn chạy sudo 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