it-swarm-vi.tech

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

Súng ngắn ảo?

38
jldugger

Ô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.

17
Severe_admin

Quá trình Zombie (thực ra bây giờ chúng được gọi là <defunct>) Thực sự không phải là một quá trình. Đây chỉ là mục trong bảng quy trình, vì vậy quy trình cha mẹ có thể thực hiện 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 cha mẹ gọi wait() khi chính cha mẹ chết.

20
vartec

Đã 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
11
ondra

Đó là một quá trình đã được giải quyết hoàn toàn nhưng vẫn tồn tại trong bảng quy trình. Tương phản điều này với một quá trình mồ côi, có cha mẹ đã chết nhưng vẫn đang thi hành.

Đâymột sốlời khuyên về việc loại bỏ chúng.

10
nedm

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ẹ chưa gặt hái nó, (tức là, waited trên đó).

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

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ột quá trình con hoàn thành và các cuộc thăm dò ý kiến ​​phụ huynh 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 đó thường có nghĩa là ứng dụng được viết kém bởi các nhà phát triển tào lao.

Thời gian duy nhất mà bạn nên quan tâm từ các quá trình zombie, là khi bạn thấy rất nhiều trong số chúng, ví dụ nếu cùng một ứng dụng tào lao đượ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 kịch bản Shell nhảm nhí được viết bởi các nhà phát triển tào lao 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.

8
Xerxes

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

[.__.] $ bắn <pid> [.__.]
[.__.] #!/bin/sh [.__.] nạn nhân = `ps -e -o pid, ppid | egrep "^\s * $ 1\b" | awk '{print $ 2}' `[.__.] nạn nhân\_name =` ps -e -o pid, cmd | egrep "^\s * $ {nạn nhân}\b" | đầu -n 1 | awk '{print $ 2}' `[.__.] # kill $ {nạn nhân} [.__.] echo" Giết $ {Vict_name}. "[.__.]

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

0
drybjed