Чи є спосіб знищити процес зомбі без перезавантаження?


48

Чи є спосіб знищити процес зомбі без перезавантаження? Ось як це сталося:

Я хочу завантажити 12 Гб файл за допомогою торрента. Після додавання .torrent-файлу передача перетворилася на процес зомбі (я також спробував ktorrent. Та сама поведінка). Нарешті я міг завантажити файл за допомогою µTorrent, але після закриття програми він також перетворюється на зомбі.

Я спробував використовувати kill, skillі pkillз різними параметрами та -9сигналом, але успіху не було.

Прочитавши деякі рішення в Інтернеті, я виявив, що вбивство батька може вбити зомбі. Але вбивство вина теж не допомогло.

Чи є інший спосіб?

Редагувати:

ps -o pid, ppid, stat, comm

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

вихід 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

Система монітора та топ показують, що процес зомбі використовує ресурси:

введіть тут опис зображення

введіть тут опис зображення

Редагувати 2: Я думаю, що щось знайшов. Я спробував вийти із системи та побачив це повідомлення:

введіть тут опис зображення

Оскільки інші клієнти-торенти мають таку саму проблему, можливо, це щось стосується розміру файлу. Я використовую ubuntu 10.04 на розділах ext4. Вбивство nautilus та відправлення сигналу SIGCHLD на нього не спрацювало.


Чи можете ви додати висновок ps -o pid,ppid,stat,commта pstreeзапитання?
Мікель

У мене є та ж проблема тут, і після googling здається, що це відбувається, коли зашифровано домашню папку під час встановлення та вибір завантаження торрентів розміром більше 4 Гб. Мені не вдалося знайти іншого способу, крім перезавантаження, щоб позбутися процесу зомбі, поїдаючи 99% процесора. bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/431975, мабуть, вирішує це, але нічого, схоже, не було зроблено для вирішення цього питання :(
user972876

Також прочитайте тут: askubuntu.com/questions/48624/what-are-zombie-process Це допоможе вирішити багато сумнівів.
Луїс Альварадо

Відповіді:


41

Я не знаю, процес зомбі - це головний біль. Процес зомбі не займає жодних ресурсів. Просто в ньому є запис у таблиці процесів.

Зомбі-процес не є сиротою, у нього є батько.

kill, skill pkillне працюватиме, оскільки процес уже загинув, тільки що його запис не було видалено.

Процес зомбі можна вбити, відправивши SIGCHLDсигнал батькові. Я думаю, що номер сигналу SIGCHLDє 17або18

Якщо це також не вдасться, можливо, ви захочете вбити самого батьків.

З Вікіпедії по сигналу SIGCHLD:

Коли дочірній процес закінчується до того, як батько викликав функцію очікування, ядро ​​зберігає певну інформацію про процес, щоб дати можливість батькові викликати очікування пізніше. Оскільки дитина все ще споживає системні ресурси, але не виконує їх, це відомо як процес зомбі.


EDIT 1 : Споживані системні ресурси - це в основному запис таблиці процесів. Якщо хтось знає, чи споживає він більше, ніж це - пам'ять або цикл процесора, то будь ласка, додайте пояснення. AFAIK навряд чи займає значні системні ресурси.


EDIT 2: Цитування з Вікіпедії

У Unix та Unix-подібних комп'ютерних операційних системах процес зомбі або неіснуючий процес - це процес, який завершив виконання, але все ще має запис у таблиці процесів. Цей запис все ще потрібен, щоб дозволити процесу, який розпочав процес (зараз зомбі), прочитати його статус виходу.

Таким чином, запис зберігається, щоб батьківський процес міг знати статус виходу, оскільки в момент, коли дитина виходить, батько, ймовірно, не перебуває у стані або не готовий прочитати його статус виходу.


EDIT 3

До цього часу я жодного разу не переживав зомбі-процесу, забираючи 100% процесора. Побачивши це вперше.

Спробуйте зробити killall utorrent.exe

Я бачу, що є два екземпляри, utorrent.exeі один з них - зомбі. Мабуть, другий (дитина). killall повинен убити батьків, оскільки дитину (зомбі) не можна вбити.


РЕДАКТ 4

Схоже, що killall не працював, оскільки він давав сигнал TERM замість KILL.

Спробуйте killall --signal=KILL utorrent.exe

Якщо це не спрацює, спробуйте вбити процес вибірково.

Отримайте список PID процесу utorrent.exe

пс -е | grep -i utorrent

У вас повинно вийти два процеси, як

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

Тож другий - батьківський. Вбийте, використовуючи

вбити -9 рр

EDIT 5

Спробуйте знайти батьківський ідентифікатор процесу за допомогою цієї команди bash

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

у вашому випадку є

кіт / proc / 7298 / статус | grep -i ppid

Якщо вихід виглядає як

PPid: 1

Тоді, на жаль, я думаю, що вам не пощастило. Ідентифікатор процесу 1належить до init, без якого система не може працювати


2
Ви писали A zombie process does not take up any resourcesі цитували the child is still consuming system resources ... it is known as a zombie process.
maaartinus

Так. Я оновив пост, щоб зрозуміти, що я маю на увазі.
Manish Sinha

7
Процес зомбі повністю займає одне з моїх процесорних ядер. Використання цього ядра на 100%. Отже, це не лише запис таблиці процесів. Я додам додаткову інформацію до питання.
Педрам

3
Зомбі, що використовує процесор, може працювати з фоновими потоками. Спробуйте використовувати top -Hдля відображення потоків замість процесів у верхній частині.
Зан Лінкс

1
Головною проблемою з неіснуючими процесами є те, що вони продовжують використовувати порти, які використовуються в кінцевому рахунку.
pietrovismara

10

Використання killсамого процесу справді малоефективне, оскільки процес уже мертвий; killприносить живий процес до стану зомбі.

Батьківський процес відповідає за підбір коду виходу з процесу; процес залишається зомбі, поки це не буде зроблено. initПроцес буде забрати код завершення будь-якого процесу і викинути його, так що це «останній інстанції» батько , який буде очищати будь-які зомбі , який є прямим нащадком.

Вбивство батька процесу зомбі, як правило, ефективно, тому що процес зомбі потім повертається до initсвого батьківського, як тільки батьківський процес пішов (тобто вбивство батька перетворило цей процес на зомбі, а бабуся і дідусь прочитали код виходу батьків , отже, батько справді пішов). Зомбі може бути батьком зомбі, тому просто вбивство батька недостатньо, його також потрібно зібрати іншим процесом.

Зауважте, що процеси ніколи не відповідають за прибирання своїх онуків - вони завжди повертаються до процесу 1 як батьків (саме тому автори демонів іноді використовують подвійну виделку () і завершують процес посередині, щоб повністю відмежувати дочірній процес від виклику оболонка)

Причина вбивства, wineймовірно, не є ефективною, оскільки вона насправді не була батьком процесу зомбі; скоріше, "utorrent.exe", який є прямим нащадком init. Однак цей процес триває нормально, просто нехтуючи своїми обов'язками.


Дякую за інформацію. Але яке рішення?
Педрам

1
Вбивство справжнього батьківського процесу, тобто того, який ps wauxперераховується у PPIDстовпчику зомбі.
Саймон Ріхтер

Як ви бачите, на виході pstree "utorrent.exe" немає жодного з батьків.
Педрам

Є два процеси з цим ім'ям, де один є дитиною іншого. Я підозрюю, що зомбі - це дитина, яка зробить батьківський "utorrent.exe" процес відповідальним за очищення; якщо ви вб'єте цей процес, то init очистить батьків, після чого дитину повторно приєднають до init та негайно прибирають.
Саймон Ріхтер

killall не працював у цьому випадку. Я запустив µTorrent зараз, і він не має жодного батька чи дитини, але його ще не можна вбити. Вихід файлу оновлено.
Педрам

3

Набагато простіший спосіб, ніж killall, -9 тощо:

1) Використовуйте замість консолі uTorrent замість qBitorrent (я також чекаю GUI-версії, а qBitorrent - це по суті).

2) Якщо ви використовуєте версію 11.04 або вище, натисніть клавішу alt + f2 (відкриває спеціальне вікно команд), введіть xkill і ваша миша тепер є x. Клацніть на програму, яку ви хочете закрити (UI = ідентифікатор процесу), і це вб'є вам це.

Розширена порада: прив’яжіть комбінацію клавіш для "xkill", як у мене на макро клавіатурі G15.


1

У моєму випадку, коли вино висить, і я не можу вбити дитину-зомбі рушницею, я би зробив:

wineserver -kтоді я вбив би "Сина процесу" killall -9 Oblivion.exe(наприклад)

З того, що я розумію, винний сервер надсилає сигнал усім своїм зомбі-дітям про те, що всі вони помруть (через рушницю, яку ви знаєте), але іноді дитина думає сама і хоче взяти світ штурмом. Тож я роблю додатковий killall -9або kill -9ідентифікатор процесу.


Це не спрацювало. Крім передачі та ktorrent є однакові проблеми, і вони не мають нічого спільного з вином.
Педрам

Я згадував частину про використання utorrent з вином, будучи вином батьком і utorrent дитиною. У будь-якому разі ви намагалися надіслати сигнал батькові, повідомляючи, що його дитина - це зомбі (щось, до чого жоден з батьків не готовий). Наприклад:kill -s SIGCHLD ppid
Луїс Альварадо

Також який тип обладнання у вас є, тому це може допомогти з'ясувати, як зомбі може використовувати ресурси до максимуму.
Луїс Альварадо

На жаль, теж не працює.
Педрам

Мій процесор є ядром i7 860.
Педрам

-4

Я думаю, що ви використовуєте SSD.

Додаючи великі торренти до клієнт-торентів, файли «заповнювача» торрента, який ви завантажуєте, фактично створюються на диску, але порожні до тих пір, поки поступово не заповнюються в процесі завантаження.

На звичайному жорсткому диску диск є вузьким місцем, і ви не помітите проблем із продуктивністю на решті робочого столу.

Однак, коли використовується SSD, процесор є вузьким місцем, і програма, здається, вийшла з ладу (стає сірою). Якщо залишити його на деякий час, воно відновиться і все буде добре. Це мій досвід з часу переходу на SSD.

Що стосується процесів вбивства, інші давали кращі поради, ніж я можу - використання сигналу KILL зазвичай працює, але у мене був дивний, який потребував перезавантаження протягом багатьох років.


1
Дякую, але я використовую звичайний жорсткий диск.
Педрам

1
"Однак, використовуючи SSD, процесор є вузьким місцем, і програма, здається, вийшла з ладу (стає сірою). Якщо ви залишите її на деякий час, вона відновиться, і все буде добре." У цій ситуації процес не є зомбі. Процеси та процеси зомбі в режимі безперебійного сну - це не одне і те ж. Процес зомбі справді більше не працює, не займає ресурсів (за винятком одного запису в таблиці процесів) і ніколи не може повернутися до життя.
Елія Каган
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.