Có cách nào để tiêu diệt quá trình zombie mà không cần khởi động lại không?


48

Có cách nào để tiêu diệt quá trình zombie mà không cần khởi động lại không? Đây là cách nó đã xảy ra:

Tôi muốn tải xuống tệp 12 GB bằng torrent. Sau khi thêm tệp .torrent, truyền đã biến thành một quá trình zombie (Tôi cũng đã thử ktorrent. Hành vi tương tự). Cuối cùng tôi có thể tải xuống tệp bằng cách sử dụngTodTorrent nhưng sau khi đóng chương trình, nó cũng biến thành zombie.

Tôi đã thử sử dụng kill, skillpkillvới các tùy chọn và -9tín hiệu khác nhau nhưng không thành công.

Sau khi đọc một số giải pháp trên web, tôi phát hiện ra việc giết cha mẹ có thể giết chết thây ma. Nhưng giết rượu cũng không giúp được gì.

Có cách nào khác không?

Biên tập:

p-pid, ppid, stat, comm

PID  PPID STAT COMMAND
7121  2692 Ss   bash
7317  7121 R+   ps

đầu ra pstree:

init─┬─GoogleTalkPlugi───4*[{GoogleTalkPlug}]
 ├─NetworkManager─┬─dhclient
 │                └─{NetworkManager}
 ├─acpid
 ├─amarok───19*[{amarok}]
 ├─apache2───5*[apache2]
 ├─atd
 ├─avahi-daemon───avahi-daemon
 ├─bonobo-activati───{bonobo-activat}
 ├─clock-applet
 ├─console-kit-dae───63*[{console-kit-da}]
 ├─cron
 ├─cupsd
 ├─2*[dbus-daemon]
 ├─2*[dbus-launch]
 ├─desktopcouch-se───desktopcouch-se
 ├─firefox───run-mozilla.sh───firefox-bin─┬─plugin-containe───8*[{plugin-contain}]
 │                                        └─14*[{firefox-bin}]
 ├─gconfd-2
 ├─gdm-binary─┬─gdm-simple-slav─┬─Xorg
 │            │                 ├─gdm-session-wor─┬─gnome-session─┬─bluetooth-apple
 │            │                 │                 │               ├─compiz───sh───gtk-window-deco
 │            │                 │                 │               ├─fusion-icon
 │            │                 │                 │               ├─gdu-notificatio
 │            │                 │                 │               ├─gnome-panel───{gnome-panel}
 │            │                 │                 │               ├─gnome-power-man
 │            │                 │                 │               ├─gpg-agent
 │            │                 │                 │               ├─gwibber-service
 │            │                 │                 │               ├─nautilus
 │            │                 │                 │               ├─nm-applet
 │            │                 │                 │               ├─polkit-gnome-au
 │            │                 │                 │               ├─2*[python]
 │            │                 │                 │               ├─qstardict───{qstardict}
 │            │                 │                 │               ├─ssh-agent
 │            │                 │                 │               ├─tracker-applet
 │            │                 │                 │               ├─trackerd
 │            │                 │                 │               ├─wakoopa─┬─wakoopa
 │            │                 │                 │               │         └─3*[{wakoopa}]
 │            │                 │                 │               └─{gnome-session}
 │            │                 │                 └─{gdm-session-wo}
 │            │                 └─{gdm-simple-sla}
 │            └─{gdm-binary}
 ├─6*[getty]
 ├─gnome-keyring-d───2*[{gnome-keyring-}]
 ├─gnome-screensav
 ├─gnome-settings-
 ├─gnome-system-mo
 ├─gnome-terminal─┬─bash───ssh
 │                ├─bash───pstree
 │                ├─gnome-pty-helpe
 │                └─{gnome-terminal}
 ├─gvfs-afc-volume───{gvfs-afc-volum}
 ├─gvfs-fuse-daemo───3*[{gvfs-fuse-daem}]
 ├─gvfs-gdu-volume
 ├─gvfsd
 ├─gvfsd-burn
 ├─gvfsd-computer
 ├─gvfsd-metadata
 ├─gvfsd-trash
 ├─hald─┬─hald-runner─┬─hald-addon-acpi
 │      │             ├─hald-addon-cpuf
 │      │             ├─hald-addon-inpu
 │      │             └─hald-addon-stor
 │      └─{hald}
 ├─indicator-apple
 ├─indicator-me-se
 ├─indicator-sessi
 ├─irqbalance
 ├─kded4
 ├─kdeinit4─┬─kio_http_cache_
 │          └─klauncher
 ├─kglobalaccel
 ├─modem-manager
 ├─multiload-apple
 ├─mysqld───10*[{mysqld}]
 ├─named───10*[{named}]
 ├─nmbd
 ├─notification-ar
 ├─notify-osd
 ├─polkitd
 ├─pulseaudio─┬─gconf-helper
 │            └─2*[{pulseaudio}]
 ├─rsyslogd───2*[{rsyslogd}]
 ├─rtkit-daemon───2*[{rtkit-daemon}]
 ├─smbd───smbd
 ├─snmpd
 ├─sshd
 ├─timidity
 ├─trashapplet
 ├─udevd───2*[udevd]
 ├─udisks-daemon─┬─udisks-daemon
 │               └─{udisks-daemon}
 ├─upowerd
 ├─upstart-udev-br
 ├─utorrent.exe───{utorrent.exe}
 ├─vnstatd
 ├─winbindd───2*[winbindd]
 ├─wnck-applet
 ├─wpa_supplicant
 └─xinetd

Màn hình hệ thống và trên cùng cho thấy quá trình zombie đang sử dụng tài nguyên:

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

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

Chỉnh sửa 2: Tôi nghĩ rằng tôi đã tìm thấy một cái gì đó. Tôi đã cố gắng đăng xuất và thấy thông báo này:

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

Vì các máy khách torrent khác có cùng một vấn đề, có lẽ đó là vấn đề về kích thước tệp. Tôi đang sử dụng Ubuntu 10.04 trên các phân vùng ext4. Giết nautilus và gửi tín hiệu SIGCHLD đến nó không hoạt động.


Bạn có thể thêm đầu ra ps -o pid,ppid,stat,commpstreecho câu hỏi của bạn?
Mikel

Tôi đang gặp vấn đề tương tự ở đây và sau khi googling, có vẻ như điều này xảy ra khi đã mã hóa thư mục nhà của bạn trong quá trình cài đặt và chọn tải xuống torrent lớn hơn 4gb. Tôi đã không thể tìm thấy bất kỳ cách nào khác ngoài khởi động lại để thoát khỏi quá trình zombie ăn 99% cpu. bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/431975 dường như để đối phó với điều này nhưng không có vẻ nhiều đã được thực hiện để giải quyết việc này :(
user972876

Ngoài ra, vui lòng đọc tại đây: askubfox.com/questions/48624/what-are-zombie- Processes Điều này sẽ giúp giải quyết nhiều nghi ngờ.
Luis Alvarado

Câu trả lời:


41

Tôi không nghĩ quá trình zombie là một vấn đề đau đầu. Một quá trình zombie không chiếm bất kỳ tài nguyên. Nó chỉ là nó có mục trong bảng quy trình.

Một quá trình Zombie không phải là một quá trình mồ côi, nó có cha mẹ.

kill, skill pkillsẽ không hoạt động vì quá trình đã bị giết, chỉ là mục nhập của nó chưa bị xóa.

Quá trình zombie có thể bị giết bằng cách gửi SIGCHLDtín hiệu cho cha mẹ. Tôi nghĩ số tín hiệu SIGCHLD17hoặc18

Nếu điều này cũng thất bại, thì bạn có thể muốn giết chính cha mẹ.

Từ Wikipedia về tín hiệu SIGCHLD:

Khi một tiến trình con kết thúc trước khi cha mẹ gọi chờ, kernel giữ lại một số thông tin về quy trình để cho phép cha mẹ gọi chờ sau đó. Bởi vì đứa trẻ vẫn đang tiêu tốn tài nguyên hệ thống nhưng không thực hiện nó được gọi là quá trình zombie.


EDIT 1 : Tài nguyên hệ thống tiêu thụ chủ yếu là mục nhập bảng quy trình. Nếu bất cứ ai biết nếu nó tiêu thụ nhiều hơn thế - bộ nhớ hoặc chu kỳ CPU, thì vui lòng thêm một lời giải thích. AFAIK nó hầu như không chiếm bất kỳ tài nguyên hệ thống quan trọng.


EDIT 2: Trích dẫn từ Wikipedia

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 quá trình bắt đầu quá trình (bây giờ là zombie) đọc trạng thái thoát của nó.

Vì vậy, mục nhập được giữ để quá trình cha mẹ có thể biết trạng thái thoát vì thời điểm đứa trẻ thoát ra, cha mẹ có thể không ở trạng thái hoặc chưa sẵn sàng để đọc trạng thái thoát.


CHỈNH SỬA 3

Cho đến ngày tôi chưa bao giờ trải qua quá trình zombie chiếm 100% CPU. Nhìn thấy điều này lần đầu tiên.

Hãy thử làm một killall utorrent.exe

Tôi có thể thấy rằng có hai trường hợp utorrent.exevà một trong số đó là zombie. Có lẽ là người thứ hai (trẻ em). killall nên giết cha mẹ vì đứa trẻ (zombie) không thể bị giết.


CHỈNH SỬA 4

Có vẻ như killall không hoạt động vì nó đang phát tín hiệu TATE thay vì KILL.

Hãy thử killall --signal=KILL utorrent.exe

Nếu điều này không hiệu quả thì hãy thử giết quá trình một cách chọn lọc.

Lấy danh sách quy trình utorrent.exe

ps -e | grep -i utorrent

Bạn sẽ nhận được hai quá trình như

xxxx ?        aa:bb:cc utorrent.exe defunct
yyyy ?        aa:bb:cc utorrent.exe

Vì vậy, người thứ hai là cha mẹ. Giết nó bằng cách sử dụng

giết -9 yyyy

EDIT 5

Vui lòng thử tìm Id gốc của quy trình bằng lệnh bash này

cat / Proc / {defuncpid} / status | grep -i ppid

trong trường hợp của bạn là

mèo / Proc / 7298 / trạng thái | grep -i ppid

Nếu đầu ra như thế nào

PPid: 1

Rồi buồn thay tôi nghĩ bạn đã hết may mắn. Id quá trình 1thuộc về init mà không có hệ thống của bạn không thể chạy


2
Bạn đã viết A zombie process does not take up any resourcesvà trích dẫn the child is still consuming system resources ... it is known as a zombie process.
maaartinus

Vâng. Tôi đã cập nhật bài viết để làm cho nó rõ ràng những gì tôi có ý nghĩa.
Manish Sinha

7
Quá trình zombie chiếm một trong số các lõi CPU của tôi. Việc sử dụng lõi đó là 100%. Vì vậy, không chỉ mục nhập bảng quy trình. Tôi sẽ thêm thông tin bổ sung vào câu hỏi.
Pedram

3
Một zombie sử dụng CPU có thể đang chạy các luồng nền. Hãy thử sử dụng top -Hđể hiển thị chủ đề thay vì các quy trình trong đầu.
Zan Lynx

1
Vấn đề chính với các quy trình không còn tồn tại là họ tiếp tục sử dụng các cổng được sử dụng cuối cùng.
pietrovismara

10

Sử dụng killvào quá trình tự nó thực sự không hiệu quả, vì quá trình đã chết; killmang lại một quá trình sống cho trạng thái zombie.

Quá trình cha có trách nhiệm chọn mã thoát của quy trình; quá trình vẫn là một thây ma cho đến khi điều này được thực hiện. Các initquá trình sẽ nhận mã lối ra của quá trình bất kỳ và vứt nó đi, vì vậy nó là "last-resort" cha mẹ rằng sẽ dọn sạch bất kỳ zombie đó là một hậu duệ trực tiếp.

Giết cha mẹ của quá trình zombie thường có hiệu quả vì quá trình zombie sau đó trở lại thành initcha mẹ của nó ngay khi quá trình cha mẹ không còn nữa (tức là giết cha mẹ đã biến quá trình đó thành zombie và ông bà đã đọc mã thoát của cha mẹ , vì vậy cha mẹ đã thực sự ra đi). Một zombie có thể là cha mẹ của một zombie, vì vậy chỉ giết cha mẹ là không đủ, nó cũng cần phải được thu thập bởi chính quá trình khác.

Lưu ý rằng các quy trình không bao giờ chịu trách nhiệm dọn dẹp cháu của họ - họ luôn hoàn nguyên quy trình 1 với tư cách là cha mẹ (đó là lý do tại sao các tác giả daemon đôi khi sử dụng một ngã ba () và chấm dứt quá trình ở giữa để tách rời hoàn toàn quy trình con khỏi lệnh gọi vỏ)

Lý do tại sao giết chóc winecó thể không hiệu quả là vì nó không thực sự là cha mẹ của quá trình zombie; đúng hơn, "utorrent.exe" là hậu duệ trực tiếp của init. Quá trình này tuy nhiên vẫn chạy bình thường, chỉ cần bỏ qua nhiệm vụ của nó.


Cảm ơn thông tin. Nhưng giải pháp là gì?
Pedram

1
Giết quá trình cha mẹ thực sự , tức là quá trình ps wauxliệt kê trong PPIDcột cho zombie.
Simon Richter

Như bạn có thể thấy trong đầu ra pstree "utorrent.exe" không có cha mẹ.
Pedram 18/03

Có hai quá trình với tên đó, trong đó một là con của người kia. Tôi nghi ngờ zombie là đứa trẻ, điều này sẽ khiến quá trình "utorrent.exe" của cha mẹ chịu trách nhiệm dọn dẹp; nếu bạn giết quá trình đó, thì init sẽ dọn sạch cha mẹ, sau đó đứa trẻ được gắn lại vào init và ngay lập tức được dọn sạch.
Simon Richter

killall đã không hoạt động trong trường hợp đó. Tôi đã bắt đầu ngay bây giờ và nó không có cha mẹ hoặc con cái, nhưng không thể bị giết. Đầu ra được cập nhật.
Pedram

3

Cách dễ dàng hơn nhiều so với killall, -9, v.v .:

1) Sử dụng qBitorrent thay vì giao diện điều khiển uTorrent (Tôi cũng đang chờ phiên bản GUI và qBitorrent thực chất là nó).

2) Nếu bạn đang sử dụng 11.04 trở lên, hãy nhấn alt + f2 (mở cửa sổ lệnh đặc biệt), nhập xkill và chuột của bạn bây giờ là x. Nhấp vào chương trình bạn muốn đóng (UI = process ID) và nó sẽ giết nó cho bạn.

Mẹo nâng cao: liên kết một phím tắt cho "xkill" như tôi có trên bàn phím macro G15.


1

Trong trường hợp của tôi khi rượu treo và tôi không thể giết đứa trẻ Zombie bằng một khẩu súng ngắn tôi sẽ làm:

wineserver -ksau đó tôi sẽ giết "Con của quá trình" killall -9 Oblivion.exe(Ví dụ)

Đối với những gì tôi hiểu, Wineerver gửi tín hiệu cho tất cả các Zombie Zombie của họ rằng tất cả họ sẽ chết (Vì khẩu súng mà bạn biết) nhưng đôi khi một đứa trẻ tự nghĩ và muốn đưa cả thế giới đi bão. Vì vậy, tôi làm bổ sung killall -9hoặc kill -9với id của quá trình.


Nó cũng không hoạt động. Truyền tải và ktorrent có cùng một vấn đề và chúng không liên quan gì đến rượu vang.
Pedram

Tôi đã đề cập đến phần về việc sử dụng utorrent với rượu là rượu của cha mẹ và utorrent cho trẻ. Dù sao, bạn đã cố gắng gửi tín hiệu cho cha mẹ cho nó biết rằng con của nó là một thây ma (Điều mà không có cha mẹ nào sẵn sàng). Ví dụ:kill -s SIGCHLD ppid
Luis Alvarado

Ngoài ra bạn có loại phần cứng nào để có thể giúp tìm ra cách zombie có thể sử dụng tài nguyên đến mức tối đa.
Luis Alvarado

Thật không may cũng không hoạt động.
Pedram 18/03

Bộ xử lý của tôi là lõi i7 860.
Pedram

-4

Tôi đoán là bạn đang sử dụng SSD.

Khi thêm torrent lớn vào máy khách torrent, các tệp "giữ chỗ" của torrent bạn đang tải xuống thực sự được tạo trên đĩa, nhưng trống cho đến khi được lấp đầy dần trong quá trình tải xuống.

Với một đĩa cứng thông thường, đĩa là nút cổ chai và bạn sẽ không nhận thấy vấn đề về hiệu năng với phần còn lại của máy tính để bàn.

Tuy nhiên, khi sử dụng SSD, CPU là nút cổ chai và ứng dụng dường như đã bị sập (chuyển sang màu xám). Nếu bạn để nó trong một thời gian, nó sẽ phục hồi và tất cả sẽ ổn. Đây là kinh nghiệm của tôi kể từ khi chuyển sang SSD.

Liên quan đến quá trình tiêu diệt, những người khác đã cung cấp lời khuyên tốt hơn tôi có thể - sử dụng tín hiệu KILL thường hoạt động, nhưng tôi đã có một quy trình kỳ lạ cần khởi động lại trong nhiều năm.


1
Cảm ơn, nhưng tôi đang sử dụng một đĩa cứng bình thường.
Pedram

1
"Tuy nhiên, khi sử dụng SSD, CPU là nút cổ chai và ứng dụng dường như đã bị sập (chuyển sang màu xám). Nếu bạn để nó trong một thời gian, nó sẽ phục hồi và tất cả sẽ ổn." Trong tình huống đó, quá trình không phải là một thây ma. Quá trình zombie và quá trình trong giấc ngủ không bị gián đoạn không giống nhau. Một quá trình zombie thực sự không còn chạy nữa, không chiếm tài nguyên (ngoại trừ một mục duy nhất trong bảng quy trình) và không bao giờ có thể trở lại với cuộc sống.
Eliah Kagan
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.