Czy jest jakiś sposób na zabicie procesu zombie bez restartu?

48

Czy jest jakiś sposób na zabicie procesu zombie bez restartu? Oto jak to się stało:

Chcę pobrać plik 12 GB za pomocą torrenta. Po dodaniu pliku .torrent transmisja zmieniła się w proces zombie (próbowałem też ktorrent. Takie samo zachowanie). Wreszcie mogłem pobrać plik za pomocą µTorrenta, ale po zamknięciu programu zmienia się on również w zombie.

Próbowałem za pomocą kill, skilloraz pkillz różnymi opcjami i -9sygnał, ale bez powodzenia.

Po przeczytaniu niektórych rozwiązań w Internecie dowiedziałem się, że zabicie rodzica może zabić zombie. Ale zabijanie wina też nie pomogło.

Czy jest inny sposób?

Edytować:

ps -o pid, ppid, stat, comm

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

wyjście 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

Monitor systemu i góra pokazują, że proces zombie wykorzystuje zasoby:

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Edycja 2: Myślę, że coś znalazłem. Próbowałem się wylogować i zobaczyłem ten komunikat:

wprowadź opis zdjęcia tutaj

Ponieważ inni klienci torrentów mają ten sam problem, może chodzi o rozmiar pliku. Używam Ubuntu 10.04 na partycjach ext4. Zabijanie nautilusa i wysyłanie do niego sygnału SIGCHLD nie działało.

Pedram
źródło
Czy możesz dodać wynik ps -o pid,ppid,stat,commi pstreedo swojego pytania?
Mikel
Mam tutaj ten sam problem i po googlowaniu wydaje się, że dzieje się tak, gdy zaszyfrowałem folder domowy podczas instalacji i wybrałeś pobieranie torrentów większych niż 4 GB. Nie byłem w stanie znaleźć innego sposobu niż ponowne uruchomienie, aby pozbyć się procesu zombie jedzącego 99% procesora. bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/431975 wydaje się być w stanie sobie z tym poradzić, ale wydaje się, że niewiele zostało zrobionych w celu rozwiązania tego problemu :(
user972876
Przeczytaj także tutaj: askubuntu.com/questions/48624/what-are-zombie-processes Pomoże to rozwiązać wiele wątpliwości.
Luis Alvarado,

Odpowiedzi:

41

Nie sądzę, że proces zombie jest bardzo bolesny. Proces zombie nie zajmuje żadnych zasobów. Po prostu ma wpis w tabeli procesów.

Proces Zombie nie jest procesem osieroconym, ma rodzica.

kill, skill pkillnie będzie działać, ponieważ proces został już zabity, tylko że jego wpis nie został usunięty.

Proces zombie można zabić, wysyłając SIGCHLDsygnał do rodzica. Myślę, że numerem sygnału SIGCHLDjest 17lub18

Jeśli to również się nie powiedzie, możesz zabić samego rodzica.

Z Wikipedii na temat sygnału SIGCHLD:

Kiedy proces potomny kończy się, zanim rodzic nie wywoła funkcji oczekiwania, jądro zachowuje pewne informacje o procesie, aby umożliwić rodzicowi wywołanie oczekiwania później. Ponieważ dziecko wciąż zużywa zasoby systemowe, ale go nie wykonuje, jest to proces zombie.


EDYCJA 1 : Zużyte zasoby systemowe to głównie pozycja tabeli procesów. Jeśli ktoś wie, czy zużywa więcej - cykl pamięci lub procesora, proszę dodać wyjaśnienie. AFAIK prawie nie zajmuje znaczących zasobów systemowych.


EDYCJA 2: Cytowanie z Wikipedii

W systemach operacyjnych Unix i podobnych do Unixa proces zombie lub proces zlikwidowany to proces, który zakończył wykonywanie, ale nadal ma wpis w tabeli procesów. Ten wpis jest nadal potrzebny, aby proces, który rozpoczął proces (teraz zombie), mógł odczytać jego status wyjścia.

W związku z tym wpis jest zachowywany, aby proces nadrzędny mógł poznać status wyjścia, ponieważ w momencie, gdy dziecko kończy pracę, rodzic prawdopodobnie nie jest w stanie lub nie jest gotowy do odczytania swojego statusu wyjścia.


EDYCJA 3

Do tej pory nigdy nie doświadczyłem procesu zombie zajmującego 100% procesora. Widząc to po raz pierwszy.

Spróbuj zrobić killall utorrent.exe

Widzę, że są dwa przypadki, utorrent.exea jednym z nich jest zombie. Prawdopodobnie drugi (dziecko). killall powinien zabić rodzica, ponieważ nie można zabić dziecka (zombie).


EDYCJA 4

Wygląda na to, że killall nie działał, ponieważ dawał sygnał TERM zamiast KILL.

Spróbować killall --signal=KILL utorrent.exe

Jeśli to nie zadziała, spróbuj zabić proces selektywnie.

Pobierz listę PID procesu utorrent.exe

ps -e | grep -i utorrent

Powinieneś dostać dwa takie procesy

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

Drugi to rodzic. Zabij to za pomocą

zabij -9 rrrr

EDYCJA 5

Spróbuj znaleźć identyfikator rodzica procesu za pomocą tego polecenia bash

cat / proc / {defunctpid} / status | grep -i ppid

w twoim przypadku jest

cat / proc / 7298 / status | grep -i ppid

Jeśli wynik jest podobny

PPid: 1

Więc niestety myślę, że nie masz szczęścia. Identyfikator procesu 1należy do init, bez którego twój system nie może działać

Manish Sinha
źródło
2
Pisałeś A zombie process does not take up any resourcesi cytowałeś the child is still consuming system resources ... it is known as a zombie process.
maaartinus
Tak. Zaktualizowałem post, aby wyjaśnić, o co mi chodzi.
Manish Sinha
7
Proces zombie zajmuje całkowicie jeden z moich rdzeni procesora. Wykorzystanie tego rdzenia odbywa się w 100%, więc nie jest to tylko wpis w tabeli procesów, dodam dodatkowe informacje do pytania.
Pedram
3
Zombie korzystające z procesora CPU mogą być uruchomione w tle. Spróbuj top -Hwyświetlić wątki zamiast procesów u góry.
Zan Lynx,
1
Główny problem z niedziałającymi procesami polega na tym, że używają one ostatecznie używanych portów.
pietrovismara
10

Korzystanie killz samego procesu jest rzeczywiście nieskuteczne, ponieważ proces jest już martwy; killwprowadza proces na żywo do stanu zombie.

Proces nadrzędny jest odpowiedzialny za pobranie kodu zakończenia procesu; proces pozostaje zombie, dopóki nie zostanie to zrobione. initProces będzie odebrać kod zakończenia jakiegokolwiek procesu i należy go wyrzucić, więc jest to „last resort” rodzic, który będzie oczyścić każdą zombie, który jest bezpośrednim potomkiem.

Zabicie rodzica procesu zombie jest zwykle skuteczne, ponieważ proces zombie powraca wtedy do initroli rodzica, gdy tylko proces rodzica zniknie (tzn. Zabicie rodzica zmieniło ten proces w zombie, a dziadek przeczytał kod wyjścia rodzica , więc rodzic naprawdę zniknął). Zombie może być rodzicem zombie, więc samo zabicie rodzica nie jest wystarczające, musi zostać również zebrane przez inny proces.

Zauważ, że procesy nigdy nie są odpowiedzialne za sprzątanie wnuków - zawsze przywracają proces 1 jako rodzic (dlatego autorzy demonów czasami używają podwójnego rozwidlenia () i przerywają proces w środku, aby całkowicie oddzielić proces potomny od wywołania muszla)

Powodem, dla którego zabijanie wineprawdopodobnie nie jest skuteczne, jest to, że tak naprawdę nie był rodzicem procesu zombie; raczej „utorrent.exe”, który jest bezpośrednim potomkiem init, to. Proces ten jednak nadal przebiega normalnie, po prostu zaniedbując swoje obowiązki.

Simon Richter
źródło
Dzięki za informację. Ale jakie jest rozwiązanie?
Pedram
1
Zabicie prawdziwego procesu nadrzędnego, tj. Tego, który ps wauxwymienia w PPIDkolumnie dla zombie.
Simon Richter
Jak widać na wyjściu pstree, „utorrent.exe” nie ma żadnego rodzica.
Pedram,
Istnieją dwa procesy o tej nazwie, z których jeden jest dzieckiem drugiego. Podejrzewam, że zombie jest dzieckiem, co spowodowałoby, że nadrzędny proces „utorrent.exe” byłby odpowiedzialny za czyszczenie; jeśli zabijesz ten proces, init oczyści rodzica, po czym dziecko zostanie przywiązane do init i od razu również wyczyszczone.
Simon Richter
killall nie działał w tym przypadku. Teraz uruchomiłem µTorrent i nie ma on żadnego elementu nadrzędnego ani podrzędnego, ale nie można go jeszcze zabić. dane wyjściowe drzewa są aktualizowane.
Pedram
3

Znacznie łatwiejszy sposób niż killall, -9 itp .:

1) Użyj qBitorrent zamiast konsoli uTorrent (czekam również na wersję GUI, a qBitorrent w zasadzie to jest).

2) Jeśli używasz wersji 11.04 lub nowszej, naciśnij Alt + F2 (otwiera specjalne okno poleceń), wpisz xkill, a twoja mysz będzie teraz x. Kliknij program, który chcesz zamknąć (UI = ID procesu), a on go zabije.

Porada zaawansowana: powiąż skrót klawiaturowy dla „xkill”, tak jak mam to na mojej klawiaturze makr G15.

d4m1r
źródło
1

W moim przypadku, gdy wino wisi i nie mogę zabić dziecka Zombie strzelbą, zrobiłbym:

wineserver -kwtedy zabiłbym „syna procesu” killall -9 Oblivion.exe(na przykład)

Z tego, co rozumiem, wineserver wysyła sygnał do wszystkich swoich Zombie Childs, że wszyscy umrą (Z powodu strzelby, którą znasz), ale czasami dziecko myśli samo i chce podbić świat burzą. Więc robię dodatkowe killall -9lub kill -9z identyfikatorem procesu.

Luis Alvarado
źródło
To też nie działało. Poza tym transmisja i ktorrent mają ten sam problem i nie mają nic wspólnego z winem.
Pedram
Wspominałem o części dotyczącej używania utorrenta z winem jako rodzicem i utorrentem dla dziecka. W każdym razie próbowałeś wysłać rodzicowi sygnał informujący, że jego dziecko to zombie (coś, na co nie jest gotowy żaden rodzic). Na przykład:kill -s SIGCHLD ppid
Luis Alvarado,
Również jaki masz sprzęt, który może pomóc dowiedzieć się, jak zombie może maksymalnie wykorzystać zasoby.
Luis Alvarado
Niestety też nie działa.
Pedram
Mój procesor to rdzeń i7 860.
Pedram
-4

Domyślam się, że używasz dysku SSD.

Podczas dodawania dużych torrentów do klienta torrent, pliki „zastępcze” pobieranego torrenta są faktycznie tworzone na dysku, ale są puste, dopóki nie zostaną stopniowo wypełnione podczas procesu pobierania.

W przypadku normalnego dysku twardego dysk jest wąskim gardłem i nie zauważysz problemu z wydajnością w pozostałej części pulpitu.

Podczas korzystania z dysku SSD procesor jest wąskim gardłem, a aplikacja wydaje się ulegać awarii (staje się szara). Jeśli odejdziesz na chwilę, wszystko wróci do normy i wszystko będzie dobrze. Takie było moje doświadczenie od czasu przejścia na dysk SSD.

Jeśli chodzi o procesy zabijania, inni udzielili lepszych porad niż ja - użycie sygnału KILL zwykle działa, ale miałem dziwny, który wymagał ponownego uruchomienia na przestrzeni lat.


źródło
1
Dzięki, ale używam normalnego dysku twardego.
Pedram
1
„Jednak w przypadku korzystania z dysku SSD wąskim gardłem jest procesor, a aplikacja prawdopodobnie uległa awarii (staje się szara). Jeśli pozostawisz go na chwilę, odzyska on sprawność i wszystko będzie dobrze”. W tej sytuacji proces nie jest zombie. Procesy zombie i procesy w nieprzerwanym śnie nie są tym samym. Proces zombie naprawdę już nie działa, nie zajmuje zasobów (z wyjątkiem pojedynczego wpisu w tabeli procesów) i nigdy nie może wrócić do życia.
Eliah Kagan