Cách giết quy trình <defposed> với cha mẹ 1


17

Tôi đang chạy Bacula trên một hộp RedHat. Thỉnh thoảng, bacemon-sd lưu trữ ngừng hoạt động và trở thành <defunct>.

[root@backup ~]# ps -ef | grep defunct | more
root      4801 29261  0 09:25 pts/5    00:00:00 grep defunct
root      5825     1  0 Oct18 ?        00:00:00 [bacula-sd] <defunct>

Câu hỏi của tôi là, làm thế nào tôi có thể giết quá trình này? Cha mẹ của nó là 1, đó là init, theo như tôi biết, và tôi sẽ không muốn giết tiến trình init, phải không?

'Thông thường' giết quá trình này không hoạt động:

[root@backup ~]# kill -0 5825
[root@backup ~]# kill -9 5825

Trợ giúp được đánh giá rất cao!

Chỉnh sửa: đang chạy

[root@backup ~]# lsof -p 5825

tạo ra đầu ra sau:

COMMAND    PID USER   FD   TYPE  DEVICE     SIZE    NODE NAME
bacula-sd 5825 root  cwd    DIR   253,0     4096 3801089 /root
bacula-sd 5825 root  rtd    DIR   253,0     4096       2 /
bacula-sd 5825 root  txt    REG   253,0  2110599  368004 /usr/local/sbin/bacula-sd
bacula-sd 5825 root  mem    REG   253,0    75284  389867 /usr/lib/libz.so.1.2.3
bacula-sd 5825 root  mem    REG   253,0    46680 3604521 /lib/libnss_files-2.5.so
bacula-sd 5825 root  mem    REG   253,0   936908  369115 /usr/lib/libstdc++.so.6.0.8
bacula-sd 5825 root  mem    REG   253,0   125736 3606807 /lib/ld-2.5.so
bacula-sd 5825 root  mem    REG   253,0  1602128 3606885 /lib/libc-2.5.so
bacula-sd 5825 root  mem    REG   253,0   208352 3606892 /lib/libm-2.5.so
bacula-sd 5825 root  mem    REG   253,0   125744 3606887 /lib/libpthread-2.5.so
bacula-sd 5825 root  mem    REG   253,0    25940 3604573 /lib/libacl.so.1.1.0
bacula-sd 5825 root  mem    REG   253,0    15972 3604535 /lib/libattr.so.1.1.0
bacula-sd 5825 root  mem    REG   253,0    46548 3606908 /lib/libgcc_s-4.1.2-20080102.so.1
bacula-sd 5825 root  mem    REG   253,0 56422480  366368 /usr/lib/locale/locale-archive
bacula-sd 5825 root    0r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    1r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    2r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    3u   CHR   9,128             6469 /dev/nst0
bacula-sd 5825 root    4u  IPv4 1023380              TCP backup:bacula-sd (LISTEN)
bacula-sd 5825 root    5u  IPv4 2693268              TCP backup:bacula-sd->backup:53957 (CLOSE_WAIT)
bacula-sd 5825 root    7u  IPv4 3248683              TCP backup:bacula-sd->backup:57629 (CLOSE_WAIT)
bacula-sd 5825 root    8u  IPv4 3250966              TCP backup:bacula-sd->backup:37650 (CLOSE_WAIT)
bacula-sd 5825 root    9u  IPv4 3253908              TCP backup:bacula-sd->backup:37671 (CLOSE_WAIT)

Câu trả lời:


18

Cách duy nhất bạn có thể loại bỏ quá trình zombie / không còn tồn tại, là giết cha mẹ. Vì cha mẹ là init (pid 1), điều đó cũng sẽ làm mất hệ thống của bạn.

Điều này khá nhiều để lại cho bạn hai lựa chọn.

  • Tự sửa đổi bảng quy trình, vd. tạo ra một quy trình giả, liên kết quá trình không còn tồn tại như một đứa trẻ của hình nộm, sau đó giết chúng đi. Khá nguy hiểm và bạn có thể phải tự dọn sạch các tài nguyên quy trình khác như semaphores và xử lý tệp.
  • Khởi động lại hệ thống.

Tôi sẽ đi với cái thứ hai.


2
+1. Tuy nhiên, cũng không có gì phải làm, miễn là nhiều quá trình zombie không xuất hiện hoặc quá trình zombie của bạn đã không khóa 4G RAM của bạn. :)
Kyle Smith

1
"Vì cha mẹ là init (pid 1), điều đó cũng sẽ phá hủy hệ thống của bạn" - Bạn không thể giết initvì nó không có bộ xử lý tín hiệu cho SIGKILL. Xem man 2 kill.
Cawflands

Làm thế nào để bạn làm đầu tiên?
skerit

@AndrewH Tôi không chắc SIGKILL phụ thuộc vào bộ xử lý tín hiệu trong quy trình đích, nhưng sự thật là hạt nhân thông thường sẽ bỏ qua SIGKILL để khởi tạo. Tuy nhiên, nếu bạn hết những cách hay hơn để kích hoạt sự hoảng loạn hạt nhân, tôi nghĩ bạn sẽ thấy rằng trên hầu hết các hệ thống Linux, SIGSEGV sẽ hoạt động khá tốt.
Roy

1
Cần lưu ý rằng một trong những initcông việc của họ là gặt hái các quy trình zombie, vì vậy nếu bạn chờ đợi đủ lâu initthì nên dọn sạch các quy trình zombie. Mặc dù, hầu hết mọi người initnên thiết lập trình xử lý SIGCHLDđể SIG_IGN khắc phục điều này.
cyphar

3

Bạn có thể thử khởi động lại init:

 # telinit u

Nếu không, tôi sẽ không lo lắng quá nhiều. Nó không chạy và nó không lấy bất kỳ tài nguyên nào và nó chỉ ở đó để kernel có thể nhớ nó.


1
tốt, tôi phải lo lắng đó là một máy sản xuất chạy các dịch vụ sao lưu (bacula) và voip (dấu hoa thị). miễn là quá trình bacula-sd không còn tồn tại, bacula dường như không thể truy cập vào ổ đĩa băng ...
andreas-h

Nó không nên mở bất kỳ tập tin nào. Chạy lsof -p 5825 và kiểm tra.
David Pashley

Chà, dường như có nhiều thứ mở ra ... xem ở trên. Bất cứ ý tưởng những gì tôi có thể làm? Tôi chưa bao giờ sử dụng lsof ...
andreas-h

1
Vâng, zombie của bạn đã mở / dev / nst0. Khởi động lại hệ thống có lẽ là đặt cược tốt nhất tại thời điểm này.
Kyle Smith

5
Đúng, khởi động lại dường như là câu trả lời phổ biến. Tôi luôn cảm thấy như mình đã thất bại khi phải khởi động lại máy chủ. :(
David Pashley

3

Kiểm tra nếu có một hạt nhân hoảng loạn,

# dmesg |tail

Kiểm tra xem quá trình có ở chế độ ngủ không thể "D" không, trong đó ở chế độ kernel cho một số tòa nhà chưa được trả lại (có thể là hạt nhân hoặc một số lý do khác) http://www.nabble.com/What-causes-an -unkillable-process - td20645581.html


định dạng gây phiền nhiễu
asdmin

Trên thực tế, đã không có bất kỳ sự hoảng loạn hạt nhân. quá trình ở trạng thái 'Z' - một thây ma ...
andreas-h

3

Nếu một zombie có init là cha mẹ của nó, thì init đã ngừng hoạt động bình thường. Một trong những vai trò của init là dọn dẹp zombie. Nếu nó không làm điều đó, sẽ không có ai khác làm. Vì vậy, giải pháp duy nhất là khởi động lại. Nếu init bị hỏng, thì quá trình khởi động lại có thể thất bại, vì vậy tôi đã tắt các dịch vụ quan trọng, đồng bộ hóa hệ thống tập tin rồi nhấn nút nguồn thay thế.


Tôi đồng ý về init không hoạt động đúng. Xem thêm: upstartsystemd.
Mikko Rantalainen

2

Chúng ta hãy giữ sự hoảng loạn, phải không? Một quá trình "không còn tồn tại" hoặc "zombie" không phải là một quá trình . Nó chỉ đơn giản là một mục trong bảng quy trình, với mã thoát được lưu. Do đó, một zombie không chứa tài nguyên, không mất chu kỳ CPU và không sử dụng bộ nhớ, vì đó không phải là một quá trình . Đừng để mọi thứ lạ lùng và ngứa ngáy khi cố gắng "tiêu diệt" các quá trình zombie. Giống như tên của chúng, chúng không thể bị giết, vì chúng đã chết. Nhưng không giống như loại ăn não, chúng hoàn toàn không gây hại cho ai và sẽ không cắn các quy trình khác.

Đừng để quá trình zombie ăn não của bạn. Chỉ cần bỏ qua chúng.


11
Vâng, đó là lý thuyết. Thật không may, nó không phải lúc nào cũng đúng. Một quy trình không còn tồn tại đôi khi sẽ bám vào tài nguyên hệ thống, như andreash đã được ghi lại rõ ràng.
Roy

5
Trong trường hợp của anh ta, theo sản lượng lsof, quá trình zombie đang ăn não của / dev / nst0. Anh ta cần những bộ não để tiếp tục hoạt động sao lưu.
Kyle Smith

2
Một quản trị viên hệ thống dành sự nghiệp của mình bỏ qua các quá trình Zombie cuối cùng sẽ thức dậy vào giữa đêm với cuộc sống bị hút ra khỏi chúng. Một Zombie, theo kinh nghiệm của tôi, cho thấy có gì đó không đúng. Tôi viết những thứ này ngay cả khi một đứa trẻ zombie có một số tương tác kỳ lạ với cha mẹ của nó và cha mẹ đang quay CPU của tôi. Tôi không biết đó là lỗi của ai, nhưng vấn đề là Zombie xấu và bỏ qua chúng một ngày nào đó sẽ đến ám ảnh bạn. ... Một ngày ... khi bạn đang ngủ yên bình ... vào giữa đêm ... sau một ngày mùa thu lạnh lẽo ...
Mike S

@MikeS Tôi đã có một tiếng cười tốt từ bình luận của bạn!
Paul Calabro

@MikeS có quyền. Tôi có ssh-agent defposed và ssh hay git không thể chạy đúng. chỉ khởi động lại có thể giúp đỡ. (sửa chữa tương tự như cửa sổ có ... haha)
John Tribe

0

Có vẻ như bạn đã có một quá trình mồ côi. Theo như tôi biết thì cách duy nhất để giết những thứ này là khởi động lại chiếc hộp. Thỉnh thoảng, điều này đã xảy ra trên các máy chủ ESX của tôi (vốn là linux), và khởi động lại máy chủ là cách khắc phục (từ hỗ trợ của VMware).

Tôi là một chàng trai Windows vì vậy hãy coi đó là điều đáng giá.


Thật không may, khởi động lại không phải là một lựa chọn thực sự. đó là một cỗ máy sản xuất cũng chạy các dịch vụ voip, vì vậy tôi không thể khởi động lại nó trong giờ hành chính ...
andreas-h

1
Vì vậy, bạn có thể khởi động lại nó sau giờ hành chính, phải không?
warren
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.