Vấn đề “Update xong nhưng chưa chạy” trên Linux
Hồi mới vào nghề, mình cứ tưởng gõ dnf update -y xong, thấy thanh tiến trình đạt 100% là mọi chuyện đã êm xuôi. Thực tế lại phũ phàng hơn nhiều. Có lần mình cập nhật OpenSSL để vá lỗi bảo mật khẩn cấp, nhưng khi quét lại lỗ hổng, hệ thống vẫn báo chưa fix. Lý do rất đơn giản: Các tiến trình (processes) cũ vẫn đang nạp thư viện cũ trong RAM. Bản vá mới dù đã nằm trên đĩa cứng nhưng chưa hề được kích hoạt.
Gần đây khi hỗ trợ migrate hệ thống từ CentOS 7 sang CentOS Stream 9, mình thấy nhiều bạn vẫn quên bước kiểm tra hậu cập nhật. Nếu không reboot cả server, bạn phải biết chính xác service nào đang “cầm cự” với code cũ. Đây là lúc bộ công cụ dnf-plugins-core, cụ thể là lệnh needs-restarting, phát huy tác dụng.
dnf-utils và needs-restarting là gì?
Trên CentOS Stream 9, dnf là trình quản lý gói mặc định. Để dùng các tính năng nâng cao, chúng ta cần cài thêm dnf-plugins-core (tên gọi mới của dnf-utils). Gói này cung cấp các công cụ giúp quản lý repository và kiểm tra trạng thái hệ thống cực kỳ chi tiết.
Lệnh needs-restarting sẽ quét toàn bộ tiến trình đang chạy. Sau đó, nó so sánh chúng với các file thực thi trên đĩa. Nếu phát hiện một thư viện .so đã cập nhật nhưng tiến trình vẫn dùng bản cũ, nó sẽ lập tức cảnh báo bạn.
Cài đặt dnf-utils trên CentOS Stream 9
Nhiều bản cài đặt Minimal của CentOS Stream 9 thường lược bỏ bộ công cụ này. Bạn có thể bổ sung nhanh bằng lệnh:
sudo dnf install dnf-plugins-core -y
Cài xong, bạn sẽ sở hữu ngay các lệnh quyền năng như config-manager hay needs-restarting.
3 cách dùng needs-restarting để kiểm soát hệ thống
Đừng khởi động lại server một cách mù quáng. Trên các hệ thống Production, mỗi giây downtime đều đáng giá. Mình thường dùng 3 tùy chọn sau để ra quyết định chính xác.
1. Kiểm tra xem có bắt buộc phải reboot không
Khi cập nhật Kernel, cách duy nhất để áp dụng là khởi động lại máy. Hãy dùng flag -r để kiểm tra:
needs-restarting -r
Kết quả sẽ rất rõ ràng:
- Nếu không hiện gì: Hệ thống của bạn vẫn ổn, chưa cần reboot.
- Nếu hiện thông báo “Reboot is required”: Đã đến lúc bạn cần lên lịch bảo trì rồi đấy.
2. Liệt kê các dịch vụ cụ thể cần restart
Đây là tính năng đáng giá nhất. Thay vì restart cả máy, bạn có thể chỉ cần khởi động lại Nginx hoặc MariaDB. Hãy dùng flag -s:
needs-restarting -s
Ví dụ, sau khi update glibc, danh sách trả về thường bao gồm:
# Output thực tế:
nginx.service
httpd.service
sshd.service
Lúc này, bạn chỉ cần chạy systemctl restart <tên_dịch_vụ> để làm mới chúng.
3. Truy tìm Process ID (PID) đang dùng file cũ
Nếu bạn chạy các ứng dụng tự viết (custom apps) không qua systemd, hãy chạy lệnh mà không kèm flag:
needs-restarting
Lệnh sẽ liệt kê chi tiết PID và đường dẫn file. Điều này giúp bạn biết chính xác ứng dụng nào đang chạy “đồ cổ” để can thiệp thủ công.
Kinh nghiệm vận hành thực tế
Để đảm bảo server luôn an toàn mà không gây downtime vô lý, mình thường áp dụng checklist 4 bước:
- Update: Chạy
dnf updatevào khung giờ ít người truy cập (thường là 2h sáng). - Check reboot: Dùng
needs-restarting -rđể xem có phải khởi động lại cả cụm không. - Check services: Dùng
needs-restarting -sđể lọc danh sách dịch vụ bị ảnh hưởng. - Xử lý cuốn chiếu: Ưu tiên
reloadtrước. Nếuneeds-restartingvẫn báo, mình mới thực hiệnrestart.
Có lần mình update thư viện hệ thống và danh sách cần restart dài tới 20 dịch vụ. Mình dùng một đoạn script ngắn để xử lý nhanh:
# Tự động restart các service (Hãy kiểm tra kỹ danh sách trước khi chạy)
for svc in $(needs-restarting -s); do
sudo systemctl restart $svc
echo "Done: $svc"
done
Cảnh báo: Tuyệt đối không chạy script này với các database lớn như PostgreSQL hay MySQL nếu chưa báo trước cho team Dev, vì nó sẽ ngắt kết nối đột ngột.
Một vài lưu ý nhỏ
Lệnh needs-restarting đôi khi báo sai (false positive). Trường hợp phổ biến nhất là khi một tiến trình đang mở file log cũ đã bị xóa bởi logrotate.
Trên CentOS Stream 9, lệnh có thể mất 5-10 giây để hoàn thành vì phải quét toàn bộ thư mục /proc. Đây là hiện tượng bình thường, không phải do server bị treo.
Tổng kết
Quản trị server không chỉ là cài gói tin cho xong. Việc làm chủ dnf-utils giúp bạn đảm bảo các bản vá bảo mật thực sự hoạt động. Hãy tập thói quen kiểm tra sau mỗi lần update. Nó không chỉ giúp hệ thống ổn định mà còn cho thấy sự chuyên nghiệp của bạn trong công việc.

