Câu trả lời:
Ô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:
tắt kết nối ổ cắm
dọn dẹp tập tin tạm thời
thông báo cho con của nó rằng nó sẽ biến mất
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.
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.
Đó 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.
Đây là một số lời khuyên về việc loại bỏ chúng.
Đã 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
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à wait
ed 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.
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.
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.