"quá Trình Zombie" Trên Linux Là Gì?
--- Bài mới hơn ---
Làm Thế Nào Để
Làm Thế Nào Để
Nếu bạn là người dùng Linux, bạn có thể đã thấy các quy trình zombie lộn xộn xung quanh danh ách quy trình của mình. Bạn không thể giết một quy tr
NộI Dung:
Nếu bạn là người dùng Linux, bạn có thể đã thấy các quy trình zombie lộn xộn xung quanh danh sách quy trình của mình. Bạn không thể giết một quy trình zombie vì nó đã chết – giống như một zombie thực sự.
Zombies về cơ bản là những phần 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 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 quy trình zombie tồn tạ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 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 quy trình chết trên Linux, tất cả quy trình đó không bị xóa khỏi bộ nhớ ngay lập tức – bộ mô tả quy trình của nó vẫn nằm trong bộ nhớ (bộ mô tả quy trình chỉ chiếm một lượng nhỏ bộ nhớ). Trạng thái của quy trình trở thành EXIT_ZOMBIE và quy trình gốc 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. Sau đó, quy trình mẹ được cho là thực hiện lệnh gọi hệ thống wait () để đọc trạng thái thoát của quy trình chết và thông tin khác. Điều này cho phép tiến trình mẹ lấy thông tin từ tiến trình chết. Sau khi wait () được gọi, tiến trình zombie sẽ 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 quy 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 mẹ không được lập trình đúng cách và không bao giờ gọi wait (), thì zombie con 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ị các quy trình zombie.
Nguy hiểm của quá trình Zombie
Quá trình xác sống không sử dụng hết tài nguyên hệ thống. (Trên thực tế, mỗi tiến trình sử dụng một lượng rất nhỏ bộ nhớ hệ thống để lưu bộ mô tả quy trình của nó.) Tuy nhiên, mỗi tiến trình zombie vẫn giữ lại ID tiến trình (PID) của nó. Hệ thống Linux có số lượng ID quy trình hữu hạn – 32767 theo mặc định trên 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 dưới tải – thì toàn bộ nhóm PID có sẵn cuối cùng sẽ được gán cho các quy trình zombie, ngăn các quy trình khác khởi chạy.
Tuy nhiên, một vài quy trình zombie xung quanh không có vấn đề gì – mặc dù chúng chỉ ra lỗi với quy trình 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ể giết các quy trình zombie vì bạn có thể giết các quy trình bình 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 trong hệ thống của mình – một số ít zombie là vô hại. Tuy nhiên, có một số cách bạn có thể thoát khỏi các tiến trình zombie.
Một cách là gửi tín hiệu SIGCHLD đến tiến trình mẹ. Tín hiệu này cho tiến trình cha thực hiện lệnh gọi hệ thống wait () và dọn dẹp 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 quy trình chính:
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, thì điều này sẽ không hữu ích. Bạn sẽ phải giết hoặc đóng quy trình cha 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 thây ma và trở thành cha mẹ mới của chúng. (init là quá trình đầu tiên được bắt đầu trên Linux khi khởi động và được gán PID 1.) init thực hiện định kỳ lệnh gọi hệ thống wait () để dọn dẹp các zombie con của nó, vì vậy init sẽ thực hiện ngắn gọn các zombie. Bạn có thể khởi động lại quy trình mẹ sau khi đóng nó.
Nếu một tiến trình cha mẹ tiếp tục tạo ra các thây ma, thì quy trình đó nên được sửa để nó gọi đúng quy trình wait () để gặt hái các thây ma con 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 ra thây ma.
--- Bài cũ hơn ---