Làm thế nào để tiêu diệt quá trình zombie


183

Tôi đã khởi chạy chương trình của mình ở tiền cảnh (một chương trình daemon), và sau đó tôi đã giết nó kill -9, nhưng tôi vẫn còn một thây ma và tôi không thể giết nó kill -9. Làm thế nào để tiêu diệt một quá trình zombie?

Nếu zombie là một quá trình chết (đã bị giết), làm thế nào tôi loại bỏ nó khỏi đầu ra của ps aux?

root@OpenWrt:~# anyprogramd &
root@OpenWrt:~# ps aux | grep anyprogram
 1163 root      2552 S    anyprogramd
 1167 root      2552 S    anyprogramd
 1169 root      2552 S    anyprogramd
 1170 root      2552 S    anyprogramd
10101 root       944 S    grep anyprogram
root@OpenWrt:~# pidof anyprogramd
1170 1169 1167 1163
root@OpenWrt:~# kill -9 1170 1169 1167 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]

2
ps -o ppid 1163nói gì Đó là, cha mẹ của 1163 là ai? Đó là quá trình phải chấm dứt.
William Pursell

Câu trả lời:


247

Một zombie đã chết, vì vậy bạn không thể giết nó. Để dọn sạch một thây ma, nó phải được cha mẹ của nó chờ đợi, vì vậy việc giết cha mẹ nên hoạt động để loại bỏ zombie. (Sau khi bố mẹ chết, zombie sẽ được thừa kế bởi pid 1, chúng sẽ đợi nó và xóa mục nhập của nó trong bảng quy trình.) Nếu daemon của bạn sinh ra những đứa trẻ trở thành zombie, bạn có một lỗi. Daemon của bạn sẽ chú ý khi con của nó chết và waittrên chúng để xác định trạng thái thoát của chúng.

Một ví dụ về cách bạn có thể gửi tín hiệu đến mọi quy trình là cha mẹ của zombie (lưu ý rằng điều này cực kỳ thô thiển và có thể giết chết các quy trình mà bạn không có ý định. Tôi không khuyên bạn nên sử dụng loại búa tạ này):

# Don't do this.  Incredibly risky sledge hammer!
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')

1
Nếu zombie là một quá trình chết (đã bị giết), làm thế nào tôi loại bỏ nó khỏi đầu ra của ps aux?
MOHAMED

185
Zombie phải được chờ đợi bởi cha mẹ của nó. Tìm cha mẹ của nó và tìm hiểu lý do tại sao cha mẹ đó không chú ý đến con cái của họ, sau đó nộp đơn khiếu nại với các dịch vụ xã hội. ;)
William Pursell

1
Giả sử bạn có quy trình sản xuất rất nhiều zombie, điều đó có ý nghĩa với 'uniq' các id:kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
ankon

2
thông thường, bạn có thể tìm thấy cha mẹ trong PPidhàng nếu bạncat /proc/<pid>/status
Daniel Andrei Mincă

1
Chỉ cần tưởng tượng những người không CNTT đến đây và đọc nó. Khùng.
ZitRo

68

Bạn có thể dọn sạch một tiến trình zombie bằng cách giết tiến trình cha của nó bằng lệnh sau:

kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

6
Lệnh này xóa zombie khỏi bảng quy trình, nhưng nó không 'giết' zombie. Thây ma đã chết.
William Pursell

8
Điều grepnày là không cần thiết. ps ... | awk '/[zZ]/{print $2}'
William Pursell

2
AFAICS, lệnh này không giết zombie, nhưng gửi SIGHUP đến tiến trình cha của nó (có lẽ là giết cha mẹ nếu nó không xử lý SIGHUP và khiến zombie bị trả thù thành init, như được mô tả trong câu trả lời trước). Vì vậy, hãy cẩn thận với lệnh này, nó có thể giết chết thứ mà bạn không mong đợi ...
Matthijs Kooijman

1
Điều này đã không làm việc cho tôi. tôi đã "giết -HUP processID" và quá trình vẫn còn đó với tư cách là một thây ma
kommradHomer

1
@WilliamPursell khi bạn trả lời một câu hỏi, vui lòng mô tả hậu quả của việc sử dụng dòng lệnh và những gì nó làm rõ ràng vì nó giết tất cả các chương trình đang chạy trên máy tính.
Dalek

39

Tôi đã thử:

ps aux | grep -w Z   # returns the zombies pid
ps o ppid {returned pid from previous command}   # returns the parent
kill -1 {the parent id from previous command}

cái này sẽ hoạt động :)


Trong trường hợp của tôi, zombie đã được tạo ra thông qua một kịch bản khởi động và một chương trình chưa được loại bỏ rõ ràng nên tôi đã xóa nó.
Mohammad Rafiee

1
Đã làm cho tôi. Điều này sẽ hoạt động trong một số trường hợp nhất định khi quá trình không còn tồn tại được sinh ra bởi quá trình giết chết bao phấn.
Eric S. Bullington

2
Tôi đã kiểm tra những gì cha mẹ xử lý trước khi giết nó. Và tôi đã giết nó bằng cách sử dụng -9 thay vì -1: kill -9 {id cha}
Ali

Tôi cũng đã phải sử dụng -9 để giết tôi thay vì -1
Michael Smith

26

Tìm thấy nó tại http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunc- Processes-574612 /

2) Đây là một mẹo hay từ một người dùng khác (Thxs Bill Dandreta): Đôi khi

kill -9 <pid>

sẽ không giết một quá trình. Chạy

ps -xal

Trường thứ 4 là quá trình cha mẹ, tiêu diệt tất cả cha mẹ của zombie và zombie chết!

Thí dụ

4 0 18581 31706 17 0 2664 1236 wait S ? 0:00 sh -c /usr/bin/gcc -fomit-frame-pointer -O -mfpmat
4 0 18582 18581 17 0 2064 828 wait S ? 0:00 /usr/i686-pc-linux-gnu/gcc-bin/3.3.6/gcc -fomit-fr
4 0 18583 18582 21 0 6684 3100 - R ? 0:00 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/cc1 -quie

18581, 18582, 18583Là zombie -

kill -9 18581 18582 18583

không có hiệu lực.

kill -9 31706

loại bỏ các thây ma


3
tốt, điều đó đã giết chết inittôi, và bây giờ tôi không thể làm gì và buộc phải khởi động lại ... quá trình zombie là Java, lấy 3,4GB trong 4GB RAM
Tcll

22

Tôi đã thử

kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

và nó làm việc cho tôi.

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.