Trình duyệt chrome không phản hồi và tôi đã cố gắng giết nó, nhưng thay vì biến mất, quá trình đã <defunct>
diễn ra đúng và không bị giết:
Điều gì là <defunct>
cho một quá trình và tại sao nó không bị giết?
Trình duyệt chrome không phản hồi và tôi đã cố gắng giết nó, nhưng thay vì biến mất, quá trình đã <defunct>
diễn ra đúng và không bị giết:
Điều gì là <defunct>
cho một quá trình và tại sao nó không bị giết?
Câu trả lời:
Từ đầu ra của bạn, chúng tôi thấy "không còn tồn tại", có nghĩa là quá trình đã hoàn thành nhiệm vụ hoặc đã bị hỏng hoặc bị giết, nhưng các quy trình con của nó vẫn đang chạy hoặc các quy trình cha mẹ này đang theo dõi quá trình con của nó. Để tiêu diệt loại quy trình này, tiêu diệt -9 PID không hoạt động. Bạn có thể cố gắng giết chúng bằng lệnh này nhưng nó sẽ hiển thị điều này nhiều lần.
Xác định đó là quá trình cha mẹ của quá trình không còn tồn tại này và giết nó. Để biết điều này chạy lệnh:
ps -ef | grep defunct
UID PID PPID C STIME TTY TIME CMD
1000 637 27872 0 Oct12 ? 00:00:04 [chrome] <defunct>
1000 1808 1777 0 Oct04 ? 00:00:00 [zeitgeist-datah] <defunct>
Sau đó kill -9 637 27872
, sau đó xác minh quá trình không còn tồn tại ps -ef | grep defunct
.
1
( init
) thì sao? Giả sử tôi sẽ phải đợi?
ps -ef | grep defunct | grep -v grep | cut -b8-20 | xargs kill -9
grep [d]efunct
hoặc tương tự và nó sẽ không khớp với chính nó.
parents_of_dead_kids=$(ps -ef | grep [d]efunct | awk '{print $3}' | sort | uniq | egrep -v '^1$'); echo "$parents_of_dead_kids" | xargs kill
. Chạy lại tập lệnh sau 30 giây hoặc lâu hơn, với kill -9
nếu bạn muốn. (Lưu ý rằng tôi đặc biệt không cho phép giết Init
)
Các quy trình được đánh dấu
<defunct>
là các quy trình chết (được gọi là "thây ma" ) vẫn còn bởi vì cha mẹ của chúng đã không tiêu diệt chúng đúng cách. Các quy trình này sẽ bị hủy bởiinit(8)
nếu quá trình cha mẹ thoát ra.
Bạn không thể giết nó bởi vì nó đã chết. Điều duy nhất còn lại là một mục trong bảng quy trình :
Trên các hệ điều hành máy tính giống Unix và Unix, quy trình zombie hoặc quy trình không còn tồn tại là một quy trình đã hoàn thành thực thi nhưng vẫn có một mục trong bảng quy trình. Mục này vẫn cần thiết để cho phép tiến trình cha mẹ đọc trạng thái thoát của con.
Không có hại trong việc để các quá trình như vậy trừ khi có nhiều trong số chúng. Zombie cuối cùng được gặt hái bởi cha mẹ của nó (bằng cách gọi wait(2)
). Nếu cha mẹ ban đầu không gặt hái được nó trước khi thoát ra, thì init
process ( pid == 1
) sẽ thực hiện nó sau đó. Quá trình Zombie chỉ là:
Một quy trình đã chấm dứt và bị xóa khi trạng thái thoát của nó đã được báo cáo cho một quy trình khác đang chờ quá trình đó kết thúc.
Cảm ơn bạn Mike S. Chúng tôi đã lấy dòng của bạn và viết một kịch bản sẽ giết các quy trình không còn tồn tại có cha mẹ là in.telnetd. Chúng tôi không muốn nó giết bất kỳ quy trình cha mẹ nào, chỉ cần telnetd mà chúng tôi biết đang gây ra sự cố và chúng tôi sẽ chạy nó nhiều lần để giết nhiều người nếu cần.
# egrep -v '^1$ = Make sure the process is not the init process.
# awk '{print $3}' = Print the parent process.
first_parent_of_first_dead_kid=$(ps -ef | grep [d]efunct | awk '{print $3}' | head -n1 | egrep -v '^1$')
echo "$first_parent_of_first_dead_kid"
# If the first parent of the first dead kid is in.telnetd, then kill it.
if ps -ef | grep $first_parent_of_first_dead_kid | grep in.telnetd;then
echo "We have a defunct process whose parent process is in.telnetd" | logger -t KILL-DEFUNCT-TELNET
echo "killing $first_parent_of_first_dead_kid" | logger -t KILL-DEFUNCT-TELNET
kill $first_parent_of_first_dead_kid 2>&1 | logger -t KILL-DEFUNCT-TELNET
fi
mở rộng câu trả lời của Paddington ..
Từ đầu ra của bạn, chúng tôi thấy một sự thiếu sót , có nghĩa là quá trình con này đã hoàn thành nhiệm vụ của nó hoặc đã bị hỏng hoặc bị giết. Quá trình cha mẹ của nó vẫn đang chạy và không nhận thấy đứa con đã chết của nó.
kill -9 PID
sẽ không làm việc (đã chết).
Để xác định cha mẹ của quá trình con này, hãy chạy lệnh này:
ps -ef | grep defunct
UID PID **PPID** C STIME TTY TIME CMD
1000 637 27872 0 Oct12 ? 00:00:04 [chrome] <defunct>
Xem ai là cha mẹ: ps ax | grep 27872
Nếu bạn muốn bạn có thể giết cha mẹ, và sự không còn tồn tại sẽ biến mất.
kill -9 27872
xem câu trả lời của JF Sebastian để có lý do kỹ thuật hơn.
Thêm vào câu trả lời của @ Paddington, tôi đã thêm chức năng này vào bashrc của mình để kiểm tra nhanh:
defunct(){
echo "Children:"
ps -ef | head -n1
ps -ef | grep defunct
echo "------------------------------"
echo "Parents:"
ppids="$(ps -ef | grep defunct | awk '{ print $3 }')"
echo "$ppids" | while read ppid; do
ps -A | grep "$ppid"
done
}
Nó xuất ra một cái gì đó như:
Bọn trẻ: UID PID PPID C STIME TTY TIME người dùng 25707 25697 0 Feb26 điểm / 0 00:00:00 [sh] người dùng 30381 29915 0 11:46 điểm / 7 00:00:00 grep không còn tồn tại ------------------------------ Cha mẹ: 25697 điểm / 0 00:00:00 npm
kill -9 PID
không hoạt động". Điều đó đúng một phần: trong thực tế, KHÔNG giết sẽ hoạt động. Bên cạnh đó, -9 nên được sử dụng như là phương sách cuối cùng. 99% thời gian giết mặc định của tiến trình cha mẹ sẽ giết nó VÀ gặt hái tất cả con cái. Một "giết mặc định" là một SIGTERM (-15). Tôi khuyến khích người hâm mộ của -9 (SIGKILL) đọc stackoverflow.com/questions/690415/ mẹo