Làm thế nào để giết một quá trình không thể bị giết mà không khởi động lại?


11

Có 5 quy trình không thể bị giết kill -9 $PIDvà thực thi cat /proc/$PID/cmdlinesẽ treo phiên hiện tại. Có lẽ chúng là quá trình zombie.

Thực hiện ps -ef or htopcũng sẽ treo phiên hiện tại. Nhưng topps -eđang làm việc tốt.

Vì vậy, có vẻ như có hai vấn đề mà hệ thống tập tin không đáp ứng.

Đây là một máy sản xuất chạy các máy ảo, vì vậy việc khởi động lại không phải là một lựa chọn.

Các quy trình sau id không hoạt động: 16181 16765 5985 7427 7547

Cha mẹ của các quá trình này là init

        ├─collectd(16765)─┬─{collectd}(16776)
        │                 ├─{collectd}(16777)
        │                 ├─{collectd}(16778)
        │                 ├─{collectd}(16779)
        │                 ├─{collectd}(16780)
        │                 └─{collectd}(16781)
        ├─collectd(28642)───{collectd}(28650)
        ├─collectd(29868)─┬─{collectd}(29873)
        │                 ├─{collectd}(29874)
        │                 ├─{collectd}(29875)
        │                 └─{collectd}(29876)

Và một trong những quy trình qemu không hoạt động

|-qemu-system-x86(16181)-+-{qemu-system-x86}(16232)
|                        |-{qemu-system-x86}(16238)
|                        |-{qemu-system-x86}(16803)
|                        |-{qemu-system-x86}(17990)
|                        |-{qemu-system-x86}(17991)
|                        |-{qemu-system-x86}(17992)
|                        |-{qemu-system-x86}(18062)
|                        |-{qemu-system-x86}(18066)
|                        |-{qemu-system-x86}(18072)
|                        |-{qemu-system-x86}(18073)
|                        |-{qemu-system-x86}(18074)
|                        |-{qemu-system-x86}(18078)
|                        |-{qemu-system-x86}(18079)
|                        |-{qemu-system-x86}(18086)
|                        |-{qemu-system-x86}(18088)
|                        |-{qemu-system-x86}(18092)
|                        |-{qemu-system-x86}(18107)
|                        |-{qemu-system-x86}(18108)
|                        |-{qemu-system-x86}(18111)
|                        |-{qemu-system-x86}(18113)
|                        |-{qemu-system-x86}(18114)
|                        |-{qemu-system-x86}(18119)
|                        |-{qemu-system-x86}(23147)
|                        `-{qemu-system-x86}(27051)

1
Quá trình zombie không nên gây ra vấn đề. Nếu số lượng quá trình Zombie quá lớn vượt quá giới hạn quy trình trên máy chủ thì nó sẽ gây ra sự cố.
Raza

@Salton: Chúng tôi không thể sử dụng ps -ef và htop vì vậy chúng tôi gặp một số vấn đề, có lẽ những gì chúng tôi đang thấy không được gọi là quá trình zombie?
Sam Stoelinga

1
Bạn có thể thử theo dõi bằng cách sử dụng /usr/bin/strace ps -efđể xem chính xác nơi bạn ps -efđang treo.
Raza

2
Làm thế nào bạn xác định đây là những thây ma? Điều này khá giống như quá trình treo. Có ps -elhoạt động và trạng thái là những quá trình trong?
Nils

Cuối cùng, khách hàng vẫn quyết định khởi động lại máy vì các vấn đề ngày càng nghiêm trọng hơn. Cám ơn vì tất cả đóng góp. Đã học được rất nhiều về zombie và các quá trình không thể phá vỡ.
Sam Stoelinga

Câu trả lời:


22

Bạn không có zombie. cat /proc/$PID/cmdlinesẽ không có vấn đề gì với zombie. Nếu kill -9không giết chương trình , điều đó có nghĩa là chương trình đang thực hiện một số thao tác I / O không bị gián đoạn. Điều đó thường chỉ ra một trong ba điều:

  • một hệ thống tập tin mạng không đáp ứng;
  • một lỗi kernel;
  • một lỗi phần cứng.

Các tiện ích như pscó thể bị treo nếu họ cố đọc một số thông tin như đường dẫn thực thi quy trình mà kernel không cung cấp vì một trong những lý do trên.

Hãy thử cat /proc/16181/syscallxem quy trình 16181 đang làm gì. Điều này có thể hoặc không thể hoạt động tùy thuộc vào hệ thống của bạn đã đi được bao xa.

Nếu sự cố là một hệ thống tệp mạng, bạn có thể buộc phải ngắt kết nối hoặc làm cho nó trực tuyến. Nếu vấn đề là lỗi kernel hoặc phần cứng, những gì bạn có thể làm sẽ phụ thuộc vào bản chất của lỗi. Nên khởi động lại (và nâng cấp lên kernel cố định hoặc thay thế phần cứng bị hỏng).


Cát không bao giờ trả lời. Tôi không nghĩ rằng đây là một lỗi. tôi nghĩ đó là một "tính năng".

7

Các câu trả lời khác đang giả định đây là các quá trình zombie. Một quá trình zombie là một quá trình đã chạy xong, nhưng vẫn còn trong bảng quy trình trong trường hợp cha mẹ muốn biết trạng thái thoát. Đây là những điều bình thường và initsẽ tự động dọn sạch các quá trình zombie được gán cho nó.

Quá trình zombie không bao giờ gây ra bất cứ điều gì để treo, vì vậy có vẻ như đó không phải là vấn đề của bạn. Nếu đó là một cuộc gọi hệ thống hoặc trình điều khiển bị treo, thì quá trình có thể ở trạng thái không bị gián đoạn. Có một lời giải thích tốt ở đây .


Quá nhiều quá trình zombie có thể ngăn không cho forkthành công (khi nrpocđạt đến mức khó ) vì chúng vẫn chiếm không gian trong bảng quy trình.
dhchdhd

2

Để tìm quy trình zombie trên Linux:

$ ps axo stat, ppid, pid, comm | grep -w không còn tồn tại

Z 555 10242 Damn-Zombie <defposed>

Đầu tiên, bạn có thể thử gửi tín hiệu SIGCHLD đến tiến trình cha của zombie bằng lệnh kill. Lưu ý rằng lệnh trên cung cấp cho bạn PPID (PID của tiến trình cha) của mỗi zombie. Trong ví dụ của chúng tôi, PPID của zombie là 555.

$ sudo kill -s SIGCHLD 555

Nếu một quá trình zombie vẫn không biến mất, bạn có thể giết tiến trình cha mẹ (ví dụ: 555) của zombie.

$ sudo kill -9 555

Khi tiến trình mẹ của nó bị giết, zombie sẽ được chấp nhận bởi quy trình init, là cha mẹ của tất cả các quy trình trong Linux. Quá trình init định kỳ gọi wait()để gặt hái bất kỳ quá trình zombie.


Đây là câu trả lời thực sự. Giết cha mẹ làm việc, cảm ơn.
Andrew

1

Bạn chỉ có thể giết một zombie bằng cách giết cha mẹ của nó. Một quá trình zombie đã phát hành tất cả các tài nguyên của nó và đang chờ trạng thái thoát của nó được chọn bởi cha mẹ của nó. Nó trở thành một thây ma khi cha mẹ không thực hiện waitđể nhận trạng thái thoát khỏi con của nó. Khi bạn giết cha mẹ của zombie, initchọn trạng thái thoát và zombie cuối cùng cũng chết.


Vì vậy, bạn muốn tôi giết init? Không rõ câu hỏi xin lỗi hehe nhưng phụ huynh dường như là người
khởi xướng

4
Không, chúng tôi muốn bạn không cố gắng để giết zombie. Bạn không thể giết một zombie. Câu hỏi thường gặp này cũng cũ như Unix.
tripleee

@tripleee: Yea đó là những gì tôi hiểu. Có lẽ những gì tôi đang có không phải là một thây ma. htop không hoạt động và cat / Proc / $ pid / cmdline hoặc ls / Proc / $ pid / cũng không hoạt động. Thông thường, điều này không xảy ra với zombie, đó là lý do tại sao tôi hỏi ở đây, đây không phải là vấn đề phổ biến. Tôi đã kiểm tra một số câu trả lời mà tất cả đều bảo bạn giết cha mẹ, đó là init trong trường hợp của tôi hoặc để khởi động lại.
Sam Stoelinga

1
"Giết cha mẹ" là cách để gặt hái một thây ma thông thường. Bạn không thể giết init. Nếu một zombie bị trả thù init, bạn không thể giết nó.
tripleee
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.