Quá trình zombie là gì và làm cách nào để tiêu diệt nó?


Câu trả lời:


17

Ôi Chúa ơi! Không không không. Đừng dùng kill -9.

Nó không cho quá trình một cơ hội để làm sạch:

  1. tắt kết nối ổ cắm

  2. dọn dẹp tập tin tạm thời

  3. thông báo cho con của nó rằng nó sẽ biến mất

  4. thiết lập lại các đặc điểm đầu cuối của nó và vân vân và vân vân.

Nói chung, gửi 15 và đợi một hoặc hai giây, và nếu điều đó không hiệu quả, hãy gửi 2 và nếu điều đó không hiệu quả, hãy gửi 1. Nếu không, hãy BỎ L BIN B BINNG CÁCH vì chương trình hoạt động kém!

Đừng dùng kill -9. Đừng mang ra máy gặt đập liên hợp chỉ để dọn dẹp chậu hoa.


13
giết -9 sẽ không giết zombie. Bạn phải giết cha mẹ của họ, nhìn vào pstree.
LapTop006

3
@ LapTop006: Trong trường hợp đó, họ giống ma cà rồng hơn; giết ma cà rồng đầu để ngăn chặn cuộc xâm lược.
amphetamachine

2
Câu trả lời này là sai về mọi cách. Quá trình hoàn tất; nó đã tắt các kết nối của nó, dọn sạch các tệp tạm thời, v.v. Không còn quá trình thực tế nữa, chỉ là một mục trong bảng quy trình. Đừng loại bỏ nhị phân con - nó không cư xử tệ. Điều đó chỉ có nghĩa là cha mẹ chưa tổ chức một đám tang thích hợp cho con của họ.
Ken Williams

19

Quá trình zombie (thực ra bây giờ chúng được gọi <defunct>) không thực sự là một quá trình. Đó là chỉ mục trong bảng quá trình, vì vậy quá trình cha mẹ có thể làm wait()syscall .

Bạn không nên lo lắng về họ. Chúng không chiếm bất kỳ tài nguyên nào, chúng sẽ biến mất khi bố mẹ chúng kêu gọi wait()khi chính bố mẹ chết.



9

Đã có một câu trả lời được chấp nhận, tuy nhiên: bạn CÓ THỂ giết quá trình zombie. Đính kèm với trình gỡ lỗi cho tiến trình cha và gọi hàm Waitpid. Ví dụ: - giả sử rằng cha mẹ có PID = 100, quá trình zombie có PID = 200

$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit

Hấp dẫn. Tôi sẽ thử điều này.
ewwhite

8

Một tiến trình zombie không có tài nguyên nào được phân bổ cho nó, ngoại trừ mục nhập trong cây quy trình. Điều này xảy ra khi một quá trình hoàn thành, tuy nhiên quá trình cha mẹ vẫn chưa gặt hái được nó, (nghĩa là waited trên nó).

Bạn có thể thử và buộc phụ huynh làm điều này nếu bạn muốn bằng cách gửi nó SIGCHLD ( kill -20) cho phụ huynh, nhưng không có gì đảm bảo rằng phụ huynh sẽ tôn trọng nó.

Bạn sẽ thường thấy chúng trong khoảng thời gian ngắn (ví dụ trong khi xem cây quy trình bằng cách sử dụng hàng đầu) - điều này là bình thường; Trong lát cắt thời gian giữa thời gian mà một quá trình con hoàn thành và các cuộc thăm dò của cha mẹ cho nó - quá trình con sẽ xuất hiện dưới dạng một thây ma.

Tuy nhiên, nếu bạn thấy các quá trình zombie liên tục tồn tại - điều đó không bình thường - vẫn không cần phải lo lắng - một lần nữa vì không có tài nguyên được phân bổ cho một quy trình chết - điều đó có nghĩa là ứng dụng được viết bởi các nhà phát triển tồi tệ.

Thời gian duy nhất mà bạn nên quan tâm từ các quy trình zombie, là khi bạn thấy rất nhiều trong số chúng, ví dụ nếu ứng dụng crappy tương tự được đề cập ở trên được đặt dưới tải.

Chúng tôi có rất nhiều nhà phát triển tào lao nơi tôi làm việc, và vì vậy tôi có đặc quyền xử lý các vấn đề như vậy và học tất cả các loại công cụ vô dụng trong khi làm như vậy. Trên thực tế - nhóm của tôi thường sử dụng các tập lệnh shell crappy được viết bởi các nhà phát triển crappy trong các cuộc phỏng vấn - nếu ứng viên có thể chọn rằng kịch bản đó thực sự tào lao, và cho chúng tôi biết lý do tại sao nó tệ, anh ta có một chân tốt.


0

Còn về khẩu súng ngắn ảo ...

$ bắn <pid>
#! / thùng / sh
nạn nhân = `ps -e -o pid, ppid | egrep "^ \ s * $ 1 \ b" | awk '{in $ 2}' `
nạn nhân \ _name = `ps -e -o pid, cmd | egrep "^ \ s * $ {nạn nhân} \ b" | đầu -n 1 | awk '{in $ 2}' `
#kill $ {nạn nhân}
tiếng vang "Giết $ {Vict_name}."

Và hãy nhớ: luôn bắn chúng vào đầu.


Tôi xin lỗi nhưng vì hồ sơ, tập lệnh này có lỗi đánh máy là "Vict_name" và sẽ giết cha mẹ của PID được đưa ra trên $ 1, trong mọi trường hợp xem xét nếu PID là zombie duy nhất hoặc nếu anh ta có một số anh chị em, thì đó chỉ là Giết người cha và cùng với nó, tất cả gia đình sẽ diệt vong.
Marc Riera

-1

Một quá trình zombie là một quá trình đã thực hiện xong, nhưng vẫn được liệt kê trong bảng quy trình.

giết -9 [cha process_name] sẽ đặt nó xuống, với định kiến ​​cực đoan.


giết -9 sẽ không giết quá trình zombie - đó là một lý do chúng được gọi là zombie. Một "quy trình" zombie sẽ không biến mất cho đến khi mã trả về của nó được gặt hái bởi quy trình cha.
Mei

3
Không, giết -9 trên PHỤ HUYNH sẽ giết cha mẹ, biến init thành cha mẹ, điều này sẽ gặt hái mã trả về của con.
Alan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.