Quy trình zombie. Không phải ai cũng từng nghe đến thuật ngữ thú vị nhưng đáng sợ liên quan đến hệ điều hành Linux này. Trên máy tính cá nhân, các quy trình zombie có thể không phải là mối đe dọa đối với người dùng thông thường, nhưng ở trên các máy chủ Linux, các quy trình này phải được tìm ra và tiêu diệt.
Các quy trình như vậy có thể gây ra sự cố với bảng quy trình (process table) của hệ thống và hệ quả là làm xáo trộn hoạt động bình thường của máy tính. Vì vậy, trong bài viết này, chúng ta sẽ thảo luận chi tiết về các quy trình zombie, cùng với hướng dẫn về cách tìm và tiêu diệt chúng.
1. Quy trình Zombie là gì?
Trước hết, bạn cần biết quy trình zombie thực sự là gì. Chúng là những quy trình ‘đã chết’ nhưng vẫn chiếm không gian trên bảng quy trình hệ thống. Khối điều khiển quy trình (process control block) hay PCB là một cấu trúc dữ liệu lưu trữ các chi tiết liên quan đến các quy trình riêng lẻ đang chạy trên hệ thống của bạn.
Bảng quy trình bao gồm ID quy trình (PID), liên kết đến PCB và các thông tin hữu ích khác liên quan đến quy trình. Các quy trình zombie có PID và thông tin quản lý bộ nhớ của riêng chúng. Vì hệ điều hành Linux có số PID giới hạn, các quy trình khác không thể sử dụng PID cho đến khi quy trình zombie dừng lại.
Mặc dù một hoặc hai quy trình zombie sẽ không gây ra bất kỳ sự cố làm gián đoạn hoặc giảm hiệu suất trên máy tính, nhưng một số lượng lớn các quy trình như vậy có thể gây hại cho hệ thống bằng cách làm ‘lụt’ bảng quy trình và tài nguyên.
2. Tại sao có quy trình Zombie trên Linux?
Trước hết, bạn cần hiểu về cách các quá trình bắt đầu và dừng lại trong Linux. Hệ điều hành Linux giám sát tất cả các tiến trình đang chạy và các daemon*trên máy tính. Process table (bảng quy trình) là danh sách các cấu trúc chứa tất cả các quy trình hiện đang chạy trên máy của bạn.
*Daemon (hoặc Disk And Execution MONitor) là một loại chương trình trên các hệ điều hành giống Unix, hoạt động ẩn trong background mà không cần sự kiểm soát bởi user. Daemon sẽ được kích hoạt bởi một sự kiện hoặc điều kiện nhất định.
Mỗi mục nhập quy trình trong bảng quy trình bao gồm một liên kết đến process control block (khối điều khiển quy trình) của quy trình cụ thể đó. PCB lưu trữ các chi tiết liên quan đến quá trình cụ thể đó, bao gồm:
- Trạng thái quy trình: Trạng thái hiện tại của quy trình
- Số quy trình: Một số duy nhất được sử dụng để xác định quy trình
- Bộ đếm chương trình: Chứa thông tin liên quan đến hướng dẫn tiếp theo
- Thanh ghi (Register): Danh sách tất cả các thanh ghi CPU được sử dụng bởi quá trình
- Danh sách tệp mở: Các tệp được sử dụng bởi quá trình
- Thông tin lập lịch CPU: Chứa thông tin liên quan đến thời gian CPU và tài nguyên được phân bổ cho quy trình
- Thông tin quản lý bộ nhớ: Bao gồm chi tiết về dung lượng bộ nhớ được sử dụng bởi quy trình
- Thông tin I/O: Danh sách các thiết bị đầu vào (input) hoặc đầu ra (output) được sử dụng bởi quy trình
Linux sử dụng các trạng thái quy trình sau để mô tả tất cả các quy trình của nó.
- R: Quá trình chạy (Running process)
- S: Quá trình ngủ (Sleeping process)
- D: Quá trình ngủ liên tục (Uninterruptable sleeping process)
- T: Quá trình đã chấm dứt (Terminated process)
- Z: Quá trình zombie (Zombie process)
Bất cứ khi nào một quy trình hoàn thành nhiệm vụ được giao, trạng thái quy trình của nó được đặt là Zombie hoặc Z. Mọi tiến trình đều có một tiến trình mẹ (parent process), nó sẽ gọi (call) một nhóm các hàm có tên là wait () để đợi sự thay đổi trạng thái của một tiến trình. Ví dụ: nếu trạng thái tiến trình chuyển từ Running thành Zombie, thì phương thức wait () sẽ được kích hoạt.
Phương thức wait () thường xóa PCB liên quan đến quá trình zombie đó và sau đó xóa mục nhập quá trình (process entry) đó khỏi bảng quá trình.
Nhưng đôi khi, do sự yếu kém trong khi phát triển chương trình, tiến trình mẹ không gọi hàm wait (). Và kết quả là hệ thống không xóa PCB của tiến trình zombie. Quy trình đó vẫn nằm nguyên vẹn trong bảng quy trình.
Điều này giúp quá trình zombie có tuổi thọ vô hạn. Vì hệ thống không thể hủy quy trình, nên process entry sẽ không bao giờ bị xóa và PID không bao giờ được giải phóng.
3. Tìm các quá trình Zombie như thế nào?
Bước đầu tiên để xóa các quy trình zombie trên hệ thống của bạn là tìm ra quy trình nào có trạng thái Zombie . Mặc dù bạn sẽ không thể hủy các quy trình này trực tiếp vì hệ thống đã xóa chúng khỏi bộ nhớ, nhưng bạn có thể hủy quy trình mẹ được liên kết với chúng.
Đầu tiên, bạn cần kiểm tra xem bảng tiến trình của hệ thống có quá trình zombie hay không. Bạn có thể làm điều đó một cách dễ dàng bằng cách sử dụng lệnh top. Chỉ cần mở terrminal của bạn và nhập:
top
Bạn sẽ thấy một đầu ra tương tự như kết quả này. Lưu ý số lượng các quy trình zombie ở đầu cửa sổ terminal Nếu đầu ra bằng 0, thì bạn không có gì phải lo lắng.
Bạn có thể liệt kê thông tin liên quan đến các quá trình zombie này bằng cách sử dụng lệnh ps với egrep. Egrep là một phần mở rộng của lệnh grep trong Linux, nó coi tất cả các mẫu như một chuỗi regex mở rộng.
Nhập lệnh sau để liệt kê tất cả các quá trình zombie:
ps aux | egrep "Z|defunct"
Lệnh nói trên sẽ tìm kiếm các dòng có chứa Z hoặc defunct (đã chết, không còn tồn tại) trong đầu ra do lệnh ps tạo ra. Đầu ra bao gồm danh sách các tiến trình zombie đang chạy trên hệ thống của bạn.
4. Tiêu diệt quy trình Zombie bằng lệnh kil
Bây giờ bạn đã biết những tiến trình zombie nào đang ăn mòn tài nguyên hệ thống của bạn, đã đến lúc tiêu diệt những tiến trình này.
Mặc dù cách dễ nhất để tiêu diệt các quy trình zombie là khởi động lại máy tính, nhưng đôi khi đây không phải là một lựa chọn khả thi, đặc biệt nếu bạn đang quản lý một máy chủ.
Để tiêu diệt các tiến trình zombie mà không cần tắt máy chủ của bạn, hãy ghi lại PID của bất kỳ tiến trình zombie nào. Từ phần trước, chúng ta có thể thấy rằng PID của tiến trình zombie là 18614. Sau đó, sử dụng PID này để tìm ID của tiến trình mẹ.
ps -o ppid= -p 18614
Đầu ra:
18613
Xác minh xem ID quy trình mẹ có tồn tại hay không bằng cách sử dụng lệnh ps.
ps -e | grep 18613
Bây giờ chúng ta đã xác nhận sự tồn tại của quy trình mẹ, đã đến lúc tiêu diệt nó. Chuyển cờ (flag) -SIGKILL với lệnh kill như sau:
sudo kill -SIGKILL 18613
Khi bạn đã dừng tiến trình mẹ, hệ thống sẽ xóa tiến trình zombie và tự động xóa nó khỏi bảng tiến trình.
5. Quản lý các quy trình một cách hiệu quả trên Linux
Mọi quản trị viên hệ thống phải ưu tiên giám sát các quá trình chạy trên máy Linux. Mặc dù các quy trình zombie không nhất thiết có hại cho hệ thống của bạn, nhưng chúng có thể gây ra các vấn đề về hiệu suất nếu tồn tại với số lượng lớn.
Dịch từ: https://www.makeuseof.com/what-are-zombie-processes-in-linux-and-how-to-kill-them/
>>> Nếu bạn đang có nhu cầu học lập trình trực tuyến, tìm hiểu ngay tại đây:
- Tất cả những điều bạn cần biết về khóa học lập trình tại FUNiX FPT
- 5 Điểm đáng chú ý tại khóa học lập trình trực tuyến FPT – FUNiX
- Từ A-Z chương trình học FUNiX – Mô hình đào tạo lập trình trực tuyến số 1 Việt Nam
- Lý do phổ biến khiến học viên nước ngoài chọn FUNiX
- Lưu ý để học blockchain trực tuyến hiệu quả cao tại FUNiX
- Lý do nữ giới nên chọn FUNiX để học chuyển nghề IT
- FUNiX trở thành đối tác của Liên minh Blockchain Việt Nam
- 3 lý do bạn trẻ nên học blockchain trực tuyến ở FUNiX
Vân Nguyễn
Bình luận (0
)