Các quy trình zombie trong Linux: Tìm kiếm, loại bỏ và ngăn chặn
15 phút đọc - 19 tháng 5, 2026

Tìm hiểu cách xác định, loại bỏ và ngăn chặn các tiến trình zombie trong Linux. Các lệnh, cách sửa lỗi mã và mẹo giám sát dành cho quản trị viên máy chủ.
Các tiến trình zombie trong Linux: Cách tìm và xóa chúng
Quá trình zombie là một quá trình con đã hoàn thành việc thực thi nhưng vẫn chiếm một vị trí trong bảng quá trình của kernel. Nó tồn tại vì quá trình cha chưa gọi wait() để thu thập trạng thái thoát của nó. Các quá trình zombie không tiêu tốn CPU hay bộ nhớ, nhưng mỗi quá trình đều chiếm một PID. Nếu chúng tích tụ đủ nhiều, hệ thống của bạn sẽ không thể tạo ra các quá trình mới. Bài viết này hướng dẫn cách phát hiện, loại bỏ và ngăn chặn chúng xuất hiện ngay từ đầu.
Tại sao các tiến trình zombie lại quan trọng trên máy chủ
Một quá trình zombie đơn lẻ là vô hại. Vấn đề bắt đầu khi chúng tích tụ. Hệ điều hành Linux có không gian PID hữu hạn: 32.768 trên hệ thống 32-bit và lên đến 4.194.304 trên hệ thống 64-bit. Nếu các quá trình zombie lấp đầy bảng quá trình, nhân hệ điều hành không thể tạo ra các quá trình mới. Điều đó có nghĩa là không có kết nối mới, không có luồng làm việc mới, và không có gì mới được tạo ra.
Các máy chủ web như Apache và Nginx đặc biệt dễ bị ảnh hưởng vì chúng tạo ra các tiến trình con để xử lý lưu lượng truy cập. Các bài kiểm tra hiệu năng đã chỉ ra sự sụt giảm 48% về thông lượng khi các tiến trình zombie tích tụ trên một máy chủ web bận rộn. Năm 2019, một lỗ hổng rò rỉ kênh Golang trong một pod DNS của Kubernetes đã tạo ra hơn 26.000 tiến trình zombie trên một nút duy nhất, lấp đầy bảng tiến trình và gây sập hệ thống giải quyết DNS trên toàn cụm.
Bảng dưới đây cho thấy những điểm khác biệt chính giữa một tiến trình bình thường và một tiến trình zombie:
| Đặc điểm | Quá trình bình thường | Quá trình zombie |
|---|---|---|
| Ký hiệu trạng thái | R, S, D hoặc T | Z (không còn hoạt động) |
| CPU / Bộ nhớ | Sử dụng đang hoạt động | 0% / 0 (đã kết thúc) |
| Mục nhập bảng quá trình | Một khe | Một khe |
Phản hồi kill -9 | Kết thúc ngay lập tức | Không có tác dụng (đã chết) |
| Bộ nhớ nhân | Mô tả quy trình đầy đủ | Chỉ trạng thái thoát tối thiểu |
Điểm quan trọng cần lưu ý: bạn không thể kill -9 một zombie. Nó đã chết rồi. Cách duy nhất để xóa nó là khiến tiến trình cha thu dọn nó, hoặc giết tiến trình cha để init (PID 1) sẽ kế thừa và tự động dọn dẹp nó.
Cách tìm các tiến trình zombie
Các tiến trình zombie được hiển thị với ký tự Z trong cột STAT và <defunct> bên cạnh tên lệnh. Liệt kê chúng bằng:
ps aux | grep -w ZĐể xem ID quá trình cha (PPID), thứ bạn sẽ cần để xóa:
ps -eo pid,ppid,stat,comm | grep -w ZLệnh top cũng hiển thị tổng số tiến trình zombie trong dòng tiêu đề. Để kiểm tra nhanh không tương tác:
top -bn1 | grep zombieTheo dõi tiến trình cha bằng pstree
Khi đã có PID của tiến trình zombie, hãy truy vết ngược lại để tìm tiến trình cha chịu trách nhiệm:
pstree -p -s <zombie_pid>Điều này hiển thị toàn bộ dòng dõi từ init cho đến tiến trình zombie. Nếu pstree chưa được cài đặt, ps auxf sẽ hiển thị một cây ASCII tương tự.
Đếm zombie để theo dõi
Một cách đếm sạch sẽ, loại trừ chính quá trình grep:
ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'Để giám sát liên tục trong quá trình khắc phục sự cố:
watch -n 1 'ps aux | grep -w Z | wc -l'Cách loại bỏ các tiến trình zombie
Chỉ có thể loại bỏ các quá trình zombie bằng cách thu thập trạng thái thoát của chúng. Điều đó có nghĩa là phải xử lý qua quá trình cha.
1. Tìm quy trình cha.
ps -o ppid= -p <zombie_pid>2. Gửi tín hiệu cho quá trình cha để thu hồi các quá trình con.
kill -SIGCHLD <parent_pid>Điều này yêu cầu quá trình cha gọi wait() đối với bất kỳ tiến trình con nào đã kết thúc. Phương pháp này không gây gián đoạn và hoạt động với các ứng dụng hoạt động đúng cách.
3. Nếu SIGCHLD không hoạt động, hãy khởi động lại dịch vụ.
systemctl restart <service_name>4. Nếu tiến trình cha không phản hồi, hãy kết thúc nó.
kill <parent_pid>Hoặc nếu nó bỏ qua tín hiệu SIGTERM:
kill -9 <parent_pid>Khi tiến trình cha bị kết thúc, init (PID 1) hoặc systemd hãy nhận nuôi các tiến trình zombie mồ côi và thu dọn chúng ngay lập tức. Hãy cẩn thận trên các hệ thống sản xuất. Việc kết thúc tiến trình cha cũng sẽ kết thúc tất cả các tiến trình con đang hoạt động của nó.
5. Kiểm tra quá trình dọn dẹp.
ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'Nếu số lượng là 0, bạn đã an toàn.
Ngăn chặn các quy trình zombie
Xử lý các tiến trình con trong mã của bạn
Nguyên nhân gốc rễ của hầu hết các trường hợp tích tụ zombie là quá trình cha không bao giờ gọi wait(). Sửa lỗi tại nguồn:
- C: Đặt
signal(SIGCHLD, SIG_IGN);để tự động loại bỏ thông tin thoát của tiến trình con, hoặc sử dụng trình xử lý tín hiệu vớiwaitpid(-1, NULL, WNOHANG)để thu dọn một cách không đồng bộ. - Python: Sử dụng
subprocess.run(), hàm này sẽ tự động chờ. Nếu sử dụngPopen, hãy gọiproc.wait()một cách rõ ràng. - Bash: Thêm
waitvào cuối các tập lệnh khởi chạy các tác vụ nền.
Cấu hình systemd đúng cách
Đối với các dịch vụ được quản lý bởi systemd, các cài đặt này ngăn chặn sự tích tụ của các tiến trình zombie:
KillMode=control-groupđảm bảo tất cả các tiến trình con đều bị kết thúc cùng lúc khi dịch vụ dừng lại.TimeoutStopSeccho phép tiến trình cha có thời gian thu dọn các tiến trình con trước khi systemd gửi tín hiệu SIGKILL.WatchdogSectự động khởi động lại các dịch vụ không phản hồi, xử lý các trường hợp khi tiến trình cha bị treo và ngừng dọn dẹp.
Theo dõi bảng quá trình
Thiết lập một tác vụ cron chạy mỗi 15 phút để đếm các tiến trình zombie và cảnh báo nếu số lượng vượt quá ngưỡng:
ps aux | awk '$8 ~ /Z/' | wc -lCũng nên theo dõi việc sử dụng bảng tiến trình bằng cách so sánh số lượng hiện tại với /proc/sys/kernel/pid_max. Nếu vượt quá 80%, hãy điều tra trước khi nó trở thành vấn đề. Một vài quá trình zombie thoáng qua trong quá trình hoạt động bình thường không có gì đáng lo ngại. Số lượng ngày càng tăng mà không giảm về 0 cho thấy lỗi ứng dụng cần được khắc phục.
Kết luận
Các tiến trình zombie là những tiến trình đã chết nhưng chưa được dọn dẹp. Chúng không sử dụng CPU hay bộ nhớ, nhưng chúng chiếm giữ các PID, và một bảng tiến trình đầy sẽ ngăn máy chủ của bạn thực hiện bất kỳ tác vụ hữu ích nào.
- Tìm chúng bằng
ps aux | grep -w Zvà theo dõi tiến trình cha bằngpstree. - Loại bỏ chúng bằng cách gửi
SIGCHLDđến tiến trình cha, khởi động lại dịch vụ, hoặc giết tiến trình cha như một biện pháp cuối cùng. - Ngăn chặn chúng bằng cách viết mã gọi
wait(), cấu hình systemd đúng cách và theo dõi bảng quá trình của bạn.
Nếu bạn đang chạy các khối lượng công việc có lưu lượng truy cập cao và cần cơ sở hạ tầng đáng tin cậy với quyền truy cập root đầy đủ, các máy chủ chuyên dụng của FDC mang đến cho bạn quyền kiểm soát hoàn toàn việc quản lý quy trình và cấu hình hệ thống.

Các quy trình zombie trong Linux: Tìm kiếm, loại bỏ và ngăn chặn
Tìm hiểu cách xác định, loại bỏ và ngăn chặn các tiến trình zombie trong Linux. Các lệnh, cách sửa lỗi mã và mẹo giám sát dành cho quản trị viên máy chủ.
15 phút đọc - 19 tháng 5, 2026
Danh sách kiểm tra tăng cường bảo mật máy chủ Linux
15 phút đọc - 8 tháng 5, 2026

Bạn có thắc mắc hoặc cần giải pháp tùy chỉnh?
Các tùy chọn linh hoạt
Phạm vi toàn cầu
Triển khai ngay lập tức
Các tùy chọn linh hoạt
Phạm vi toàn cầu
Triển khai ngay lập tức