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

hero section cover
Mục lục
  • Các tiến trình zombie trong Linux: Cách tìm và xóa chúng
  • Tại sao các tiến trình zombie lại quan trọng trên máy chủ
  • Cách tìm các tiến trình zombie
  • Cách loại bỏ các tiến trình zombie
  • Ngăn chặn các quy trình zombie
  • Kết luận
Chia sẻ

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ểmQuá trình bình thườngQuá trình zombie
Ký hiệu trạng tháiR, S, D hoặc TZ (không còn hoạt động)
CPU / Bộ nhớSử dụng đang hoạt động0% / 0 (đã kết thúc)
Mục nhập bảng quá trìnhMột kheMột khe
Phản hồi kill -9Kết thúc ngay lập tứcKhông có tác dụng (đã chết)
Bộ nhớ nhânMô 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 Z

Lệ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 zombie

Theo 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ới waitpid(-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ụng Popen, hãy gọi proc.wait() một cách rõ ràng.
  • Bash: Thêm wait và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.
  • TimeoutStopSec cho 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.
  • WatchdogSec tự độ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 -l

Cũ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 Z và theo dõi tiến trình cha bằng pstree.
  • 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.

Blog

Nổi bật trong tuần

Các bài viết khác
Các quy trình zombie trong Linux: Tìm kiếm, loại bỏ và ngăn chặn

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

Các bài viết khác
background image

Bạn có thắc mắc hoặc cần giải pháp tùy chỉnh?

icon

Các tùy chọn linh hoạt

icon

Phạm vi toàn cầu

icon

Triển khai ngay lập tức

icon

Các tùy chọn linh hoạt

icon

Phạm vi toàn cầu

icon

Triển khai ngay lập tức