"Quy trình Zombie" trên Linux là gì?

Mục lục:

"Quy trình Zombie" trên Linux là gì?
"Quy trình Zombie" trên Linux là gì?

Video: "Quy trình Zombie" trên Linux là gì?

Video:
Video: Series: "Nhận Biết Lừa Đảo" cùng Hiếu Pc - Phần 1 - YouTube 2024, Tháng tư
Anonim
Nếu bạn là người dùng Linux, có thể bạn đã thấy các quy trình zombie xung quanh danh sách quy trình của mình. Bạn không thể giết một quá trình zombie vì nó đã chết - giống như một zombie thực sự.
Nếu bạn là người dùng Linux, có thể bạn đã thấy các quy trình zombie xung quanh danh sách quy trình của mình. Bạn không thể giết một quá trình zombie vì nó đã chết - giống như một zombie thực sự.

Zombies về cơ bản là các bit còn sót lại của các quá trình chết chưa được dọn dẹp đúng cá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ách - các chương trình không được phép để các quá trình zombie bám sát.

Quá trình Zombie là gì?

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

Khi một quá trình chết trên Linux, nó không phải là tất cả 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ớ (trình mô tả quá trình chỉ mất một lượng nhỏ bộ nhớ). Trạng thái của quy trình trở thành EXIT_ZOMBIE và cha mẹ của quá trình được thông báo rằng quá trình con của nó đã chết với tín hiệu SIGCHLD. Quá trình cha mẹ sau đó được yêu cầu thực hiện cuộc gọi hệ thống chờ () để đọc trạng thái thoát của quá 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ừ quá trình chết. Sau khi wait () được gọi, quá trình zombie được loại bỏ 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 bạn. Tuy nhiên, nếu quy trình gốc không được lập trình đúng cách và không bao giờ gọi chờ (), trẻ em zombie của nó sẽ lưu lại trong bộ nhớ cho đến khi chúng được dọn dẹp.

Các tiện ích như GNOME System Monitor, hàng đầu lệnh và ps lệnh hiển thị quá trình zombie.

Image
Image

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

Các quá trình Zombie không sử dụng bất kỳ tài nguyên hệ thống nào. (Trên thực tế, mỗi người sử dụng một số lượng rất nhỏ bộ nhớ hệ thống để lưu trữ bộ mô tả quá trình của nó.) Tuy nhiên, mỗi quá trình zombie vẫn giữ lại quá trình ID (PID). Các hệ thống Linux có một số lượng các ID quy trình hữu hạn - 32767 theo mặc định trên các hệ thống 32 bit. Nếu zombie tích lũy ở 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 quá trình zombie đang tải - toàn bộ nhóm PID sẵn có sẽ được gán cho các quá trình zombie, ngăn chặn các quá trình khác khởi chạy.

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

Image
Image

Bắt thoát khỏi quá trình Zombie

Bạn không thể tiêu diệt các quá trình zombie vì bạn có thể tiêu diệt các tiến trình bình thường với tín hiệu SIGKILL - các quá trình zombie đã chết. Lưu ý 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 số lượng lớn trên hệ thống của mình - một số zombie vô hại. Tuy nhiên, có một vài cách bạn có thể loại bỏ các quy trình zombie.

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

kill -s SIGCHLD pid

Tuy nhiên, nếu quy trình gốc không được lập trình đúng cách và bỏ qua các tín hiệu SIGCHLD, điều này sẽ không hữu ích. Bạn sẽ phải giết hoặc đóng quá trình cha mẹ của thây ma. Khi quá trình tạo ra các thây ma kết thúc, init kế thừa 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 lúc khởi động và được gán PID 1.) init thực thi cuộc gọi wait () định kỳ để dọn dẹp các zombie của nó, vì vậy init sẽ thực hiện các hoạt động ngắn của zombie. Bạn có thể khởi động lại quá trình cha mẹ sau khi đóng nó.

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

Đề xuất: