Trang chủ » làm thế nào để » Một quá trình Zombie Zombie trên Linux là gì?

    Một quá trình Zombie Zombie trên Linux là gì?

    Nếu bạn là người dùng Linux, bạn có thể đã thấy các quy trình zombie chuyển động xung quanh danh sách quy trình của mình. Bạn không thể giết quá trình zombie vì nó đã chết - giống như một thây ma thực sự.

    Zombie về cơ bản là các phần còn lại của các quá trình chết chưa được dọn sạch. Một chương trình tạo ra các quy trình zombie không được lập trình đúng - các chương trình không được phép để các quy trình zombie tồn tại.

    Tín dụng hình ảnh: Daniel Hollister trên Flickr (Được phối lại)

    Quá trình Zombie là gì?

    Để hiểu quy trình zombie là gì và nguyên nhân khiến quy trình zombie xuất hiện, bạn sẽ cần hiểu một chút về cách các quy trình hoạt động trên Linux.

    Khi một tiến trình chết trên Linux, nó sẽ không bị xóa khỏi bộ nhớ ngay lập tức - bộ mô tả quá trình của nó nằm trong bộ nhớ (bộ mô tả quá trình chỉ chiếm một lượng bộ nhớ nhỏ). Trạng thái của quy trình trở thành EXIT_ZOMBIE và cha mẹ của quy trình được thông báo rằng quy trình con của nó đã chết với tín hiệu SIGCHLD. Quá trình cha sau đó được cho là thực hiện lệnh gọi hệ thống Wait () để đọc trạng thái thoát của tiến trình chết và các thông tin khác. Điều này cho phép tiến trình cha mẹ lấy thông tin từ tiến trình chết. Sau khi Wait () được gọi, quá trình zombie bị xóa hoàn toàn khỏi bộ nhớ.

    Điều này thường xảy ra rất nhanh, vì vậy bạn sẽ không thấy các quá trình zombie tích lũy trên hệ thống của mình. Tuy nhiên, nếu một quy trình cha mẹ không được lập trình đúng cách và không bao giờ gọi chờ (), những đứa trẻ zombie của nó sẽ lưu lại trong bộ nhớ cho đến khi chúng được dọn sạch.

    Các tiện ích như Giám sát hệ thống Gnome, hàng đầu lệnh và ps lệnh hiển thị các quá trình zombie.

    Nguy hiểm của quá trình Zombie

    Quá trình zombie không sử dụng hết tài nguyên hệ thống. (Trên thực tế, mỗi người sử dụng một lượng bộ nhớ hệ thống rất nhỏ để lưu trữ bộ mô tả quy trình của nó.) Tuy nhiên, mỗi quy trình zombie vẫn giữ ID tiến trình (PID). Các hệ thống Linux có số lượng ID quá trình hữu hạn - 32767 theo mặc định trên các hệ thống 32 bit. Nếu zombie đang tích lũy với tốc độ rất nhanh - ví dụ: nếu phần mềm máy chủ được lập trình không đúng cách đang tạo ra các quy trình zombie đang tải - thì toàn bộ nhóm các PID có sẵn cuối cùng sẽ được gán cho các quy trình zombie, ngăn các quá trình khác khởi chạy.

    Tuy nhiên, một vài quy trình zombie treo xung quanh không có vấn đề gì - mặc dù chúng chỉ ra lỗi với quy trình cha mẹ của chúng trên hệ thống của bạn.

    Thoát khỏi quá trình Zombie

    Bạn không thể tiêu diệt các quy trình zombie vì bạn có thể tiêu diệt các quy trình thông thường bằng tín hiệu SIGKILL - các quy trình zombie đã chết. Hãy nhớ rằng bạn không cần phải loại bỏ các quy trình zombie trừ khi bạn có một lượng lớn trên hệ thống của mình - một vài zombie là vô hại. Tuy nhiên, có một vài cách bạn có thể thoát khỏi quá trình zombie.

    Một cách là bằng cách gửi tín hiệu SIGCHLD đến tiến trình cha. Tín hiệu này cho biết quá trình cha mẹ thực hiện lệnh gọi hệ thống Wait () và dọn sạch các zombie con của nó. Gửi tín hiệu với giết chết lệnh, thay thế pid trong lệnh bên dưới với PID của tiến trình cha:

    giết -s SIGCHLD

    Tuy nhiên, nếu quy trình cha không được lập trình đúng và bỏ qua các tín hiệu SIGCHLD, thì điều này sẽ không có ích. Bạn sẽ phải giết hoặc đóng quá trình cha mẹ của zombie. Khi quá trình tạo ra zombie kết thúc, init sẽ thừa hưởng các quá trình zombie và trở thành cha mẹ mới của chúng. (init là quá trình đầu tiên được khởi động trên Linux khi khởi động và được gán PID 1.) init thực hiện cuộc gọi hệ thống Wait () để dọn sạch các zombie con của nó, do đó init sẽ tạo ra các zombie ngắn. Bạn có thể khởi động lại tiến trình cha sau khi đóng nó.

    Nếu một quá trình cha mẹ tiếp tục tạo ra thây ma, thì nó nên được sửa để nó gọi Wait () đúng cách để gặt hái những đứa con zombie của nó. Gửi báo cáo lỗi nếu một chương trình trên hệ thống của bạn tiếp tục tạo zombie.