Quá trình <defposed> là gì và tại sao nó không bị giết?


180

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:

nhập mô tả hình ảnh ở đây

Điều gì là <defunct>cho một quá trình và tại sao nó không bị giết?


3
Câu trả lời được chấp nhận đề cập rằng " kill -9 PIDkhô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
Mike S

Câu trả lời:


172

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.


13
bạn không thể giết quá trình "không còn tồn tại". Bạn chỉ có thể tăng tốc độ xóa mục nhập của nó trong bảng quy trình bằng cách giết cha mẹ của nó.
jfs

57
Nếu ppid là 1( init) thì sao? Giả sử tôi sẽ phải đợi?
Lục

7
để tự động tiêu diệt, bạn cũng có thể thực hiện việc này (có thể cần thay đổi byte nào bạn đang cắt từ đầu ra):ps -ef | grep defunct | grep -v grep | cut -b8-20 | xargs kill -9
warren

3
@warren Cảm ơn. Bạn cũng có thể làm cho nó ngắn hơn một chút và (imo) đơn giản hơn bằng cách không thực hiện grep thứ hai. Chỉ cần thay đổi grep đầu tiên thành grep [d]efuncthoặc tương tự và nó sẽ không khớp với chính nó.
Thor84no

4
@warren bạn không thể giết quá trình không còn tồn tại - ngay cả với SIGKILL. Hơn nữa, bạn đang sử dụng kill -9 khá bừa bãi. Xem stackoverflow.com/questions/690415/ . Nếu bạn muốn giết trẻ em không còn tồn tại, bạn có thể thử : 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 -9nếu bạn muốn. (Lưu ý rằng tôi đặc biệt không cho phép giết Init)
Mike S

60

Trang hướng dẫn ps (1) nói :

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ởi init(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ì initprocess ( 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.


1

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

1

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.


1

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