Cách khác để tiêu diệt quá trình zombie


19

Tôi chỉ nhận thấy một số quy trình zombie trên CentOS 6.8 (Final), đã cố gắng giết chúng nhưng chúng vẫn ở đó:

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     20776 20669  0 09:03 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

[root@host user]# kill 746 747 29970 29971

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     21525 20669  0 09:26 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

Như bạn có thể thấy chúng chạy trong hai tháng, và nếu chúng không gây hại, tôi sẽ loại bỏ chúng, có cách nào khác để tiêu diệt Zombie không?


1
bạn đã thử kill -9chưa
Ipor Sircer

7
Chỉ 74729971là quá trình zombie. Những người khác có thể bị nhốt nhưng họ chưa chết.
roaima

Có vẻ như bạn có một lỗi trong một số mã đang chạy trên tomcat ...
Boris the Spider

Câu trả lời:


8

Như Heemayl đã đề cập, bạn thực sự không thể giết một thây ma. Nó đã [chưa] chết ...

Tuy nhiên, vấn đề bạn đang gặp phải có vẻ như là một vấn đề với git clonelệnh. Nó bị mắc kẹt bằng cách nào đó. Có lẽ lần ra hoặc thất bại trong một số cách khác? Thông thường vì một số I / O mà một quá trình bị kẹt ở điểm mà a SIGTERMSIGINTsẽ không hoạt động.

Để tiêu diệt nó, trong trường hợp này, bạn muốn sử dụng -9tùy chọn dòng lệnh. Điều này có nghĩa là gửi SIGKILLtín hiệu. Bạn thực sự có thể sử dụng -KILLquá.

[root@host user]# kill -KILL 746 29970

Để có được danh sách các tín hiệu khả dụng, hãy sử dụng tùy chọn dòng lệnh danh sách.

[root@host user]# kill -l

Điều này cho bạn thấy các số và tên (và bạn sẽ thấy # 9 nói SIGKILL.)


1
Trên thực tế kill -KILLlà lệnh duy nhất có thể đóng các quá trình này, vì lý do này, tôi sẽ chấp nhận câu trả lời @Alexis Wilke. Nhưng chắc chắn tôi sẽ muốn bày tỏ lòng biết ơn của mình đối với câu trả lời nhanh chóng, khôn ngoan và rất nhiều thông tin +1. Nhờ tất cả mọi người
khi quân

39

Bạn không thể giết Zombie (quá trình), nó đã chết. Nó chỉ chờ quá trình cha mẹ của nó thực hiện wait(2)và thu thập trạng thái thoát của nó. Nó sẽ không lấy bất kỳ tài nguyên nào trên hệ thống ngoài mục nhập bảng quy trình.

Bạn có thể gửi SIGCHLDcho cha mẹ của nó để cho nó biết rằng một trong những đứa con của nó đã chấm dứt (tức là yêu cầu nó thu thập trạng thái thoát của trẻ em). Tín hiệu này có thể bị bỏ qua (là mặc định):

kill -CHLD <PPID>

(Thay thế <PPID>bằng PID thực tế của cha mẹ.)

Hoặc bạn có thể giết tiến trình cha mẹ để init(PID 1) sẽ kế thừa quy trình zombie và gặt hái nó đúng cách (đó là một trong initnhững nhiệm vụ chính để kế thừa bất kỳ đứa trẻ mồ côi nào và làm wait(2)thường xuyên). Nhưng giết cha mẹ là không nên. Nói chung, việc tạo các quy trình zombie chỉ ra vấn đề / vấn đề lập trình và thay vào đó bạn nên cố gắng khắc phục hoặc báo cáo vấn đề đó.


8
Bạn có thể gửi SIGCHLD cho phụ huynh để thông báo cho họ biết rằng nếu con cái của họ đã chấm dứt (nghĩa là yêu cầu nó thu thập trạng thái thoát của trẻ em), tín hiệu này có thể bị bỏ qua (mặc định) Vấn đề là nếu một quá trình bỏ qua SIGCHLD, không có zombie sẽ được tạo ra. Vì vậy, nếu nó không phớt lờ SIGCHLDvà zombie không được gặt hái, quá trình này là lỗi hoặc không quan tâm đến trẻ em zombie. Với quy trình được đề cập là git clone ..., tôi cá là nó đơn giản là không quan tâm đến trẻ em zombie vì đó là một quá trình (hy vọng) ngắn ngủi thực hiện công việc của nó và sau đó thoát ra.
Andrew Henle

1
@AndrewHenle: Mặc dù điều đó gần như đúng, nhưng hành động mặc định ( SIG_DFL) SIGCHILDcũng là để bỏ qua nó, nhưng trong trường hợp này, zombie chắc chắn không được tự động gặt hái.
R ..

@R Mặc dù điều đó gần như đúng, nhưng hành động mặc định ( SIG_DFL) cho SIGCHILDcũng là bỏ qua nó, nhưng trong trường hợp này, zombie chắc chắn không được tự động gặt hái. Tôi không chắc chắn những gì bạn đang đề cập đến. Bạn đang đề cập đến các quá trình không được gặt hái trong câu hỏi? Tôi không thấy việc gửi SIGCHLDđến một quy trình có SIGCHLDtrình xử lý của nó được đặt thành SIG_IGN(rõ ràng hoặc theo mặc định) sẽ khiến quy trình đó gặt hái bất kỳ zombie nào.
Andrew Henle

1
@AndrewHenle, gửi một SIGCHLDcó thể làm việc lần này . Lần cuối cùng nó có thể bị mất tín hiệu hoặc hai đứa trẻ chết cùng một lúc và mã không đủ thông minh để xử lý đồng thời cả hai cái chết.
Alexis Wilke

Nó không thể làm tổn thương, nhưng tôi sẽ không đặt tỷ lệ cược vào nó hoạt động.
Barmar

2

để tìm kiếm các quá trình zombie:

ps aux | grep -w Z | grep -v grep

ps -eo stat,ppid | grep -w Z

để tiêu diệt quá trình zombie, ID cha cần phải bị giết, tức là PPID:

kill PPID1 PPID2

kill $(ps -eo stat,ppid|grep -w Z|awk '{print $2}'|tr "\n" " ")

0

Khi một quá trình cha mẹ chết, tất cả quá trình zombie sẽ được dọn sạch. Đừng giết tiến trình cha mẹ chỉ để dọn sạch quá trình zombie. Nó sẽ trở lại khi bạn chạy lại chương trình của bạn. Khắc phục chương trình của bạn bằng cách gọi đúng cách cuộc gọi hệ thống của Wait Wait () và hoặc Wait Waitid ().

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.