Есть ли какой-нибудь способ убить зомби-процесс без перезагрузки?

Есть ли какой-нибудь способ убить зомби-процесс без перезагрузки? Вот как это произошло:

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

Я пытался использовать kill, skill и pkill с различными вариантами и -9 сигнал, но безуспешно.

Прочитав некоторые решения в Интернете, я узнал, что убийство родителя может убить зомби. Но убийство вином тоже не помогло.

Есть ли другой способ?

Редактировать:

ps -o pid, ppid,stat,comm

PID  PPID STAT COMMAND7121  2692 Ss   bash7317  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

Системный монитор и верхняя часть показывают, что процесс зомби использует ресурсы:

enter image description here

enter image description here

Правка 2:Кажется, я кое-что нашел. Я попытался выйти из системы и увидел это сообщение:

enter image description here

Поскольку у других торрент-клиентов есть такая же проблема, возможно, это связано с размером файла.Я использую ubuntu 10.04 на разделах ext4.Убийство наутилуса и отправка ему сигнала SIGCHLD не сработали.

Я не думаю, что процесс зомби - это большая головная боль. Процесс зомби не отнимает никаких ресурсов. Просто у него есть своя запись в таблице процессов.

Зомби-процесс не является сиротским процессом, у него есть родитель.

kill, skill pkill не будет работать, так как процесс уже убит, просто его запись не была удалена.

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

Если это также не удастся, то вы можете захотеть убить самого родителя.

Из Википедии о сигнале SIGCHLD:

Когда дочерний процесс завершается до того, как родительский процесс вызвал wait, ядро сохраняет некоторую информацию об этом процессе, чтобы позволить его родительскому процессу вызвать wait позже. Поскольку дочерний процесс все еще потребляет системные ресурсы, но не выполняется, он известен как зомби-процесс.


ПРАВКА 1: Потребляемые системные ресурсы - это в основном запись таблицы процессов. Если кто-нибудь знает, потребляет ли он больше, чем это - память или цикл процессора, то, пожалуйста, добавьте объяснение. AFAIK, это практически не занимает каких-либо значительных системных ресурсов.


ПРАВКА 2: Цитата из Википедии

В Unix и Unix-подобных компьютерных операционных системах зомби-процесс или несуществующий процесс - это процесс, который завершил выполнение, но все еще имеет запись в таблице процессов. Эта запись по-прежнему необходима, чтобы позволить процессу, который запустил (теперь зомби) процесс, прочитать его статус завершения.

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


ПРАВКА 3

До настоящего времени я никогда не сталкивался с зомби-процессом, занимающим 100% процессора. Вижу это в первый раз.

Попробуйте сделать killall utorrent.exe

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


ПРАВКА 4

Похоже, что killall не сработал, так как он подавал сигнал TERM вместо KILL.

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

Если это не сработает, попробуйте выборочно завершить процесс.

Получите список utorrent.exe ПИД процесса

ps -e | grep -i utorrent

Вы должны получить два процесса, таких как

xxxx ?        aa:bb:cc utorrent.exe defunctyyyy ?        aa:bb:cc utorrent.exe

Итак, второй - это родитель.Убейте его, используя

убийство -9 гггг

ПРАВКА 5

Пожалуйста, попробуйте найти родительский идентификатор процесса с помощью этой команды bash

cat /proc/{defunctpid}/статус | grep -i ppid

в вашем случае это

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

Если результат выглядит следующим образом

PPid: 1

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

С помощью kill на сам процесс действительно неэффективен, так как процесс уже мертв; kill переводит живой процесс в состояние зомби.

Родительский процесс отвечает за получение кода выхода процесса; процесс остается зомби до тех пор, пока это не будет сделано. То init процесс подберет код выхода любого процесса и выбросит его, так что это родительский элемент "последней инстанции", который очистит любого зомби, являющегося прямым потомком.

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

Обратите внимание, что процессы никогда не несут ответственности за очистку своих внуков - они всегда возвращаются к процессу 1 в качестве родительского (именно поэтому авторы демонов иногда используют двойную вилку () и завершают процесс посередине, чтобы полностью отделить дочерний процесс от вызывающей оболочки)

Причина, по которой убийство wine вероятно, это неэффективно, потому что на самом деле он не был родителем процесса зомби; скорее, "utorrent.exe " это прямой потомок init is. Этот процесс, однако, все еще работает нормально, просто пренебрегая своими обязанностями.

Гораздо более простой способ, чем killall, -9 и т.Д:

1) Вместо этого используйте qBitorrent вместо консольного uTorrent (я тоже жду версию с графическим интерфейсом, и qBitorrent - это, по сути, он).

2) Если вы используете версию 11.04 или выше, нажмите alt + f2 (откроется специальное окно команд), введите xkill, и ваша мышь теперь представляет собой x. Нажмите на программу, которую вы хотите закрыть (UI = идентификатор процесса), и она убьет ее для вас.

Дополнительный совет: привяжите сочетание клавиш для "xkill", как у меня на моей макро-клавиатуре G15.

В моем случае, когда вино зависает, и я не могу убить ребенка-зомби из дробовика, я бы сделал:

wineserver -k тогда я бы убил "Сына Процесса". killall -9 Oblivion.exe (Например)

Насколько я понимаю, wineserver посылает сигнал всем своим детям-зомби, что они все умрут (из-за дробовика, который вы знаете), но иногда ребенок думает сам по себе и хочет взять мир штурмом. Поэтому я делаю дополнительные killall -9 или в kill -9 с идентификатором процесса.

Я предполагаю, что вы используете твердотельный накопитель.

При добавлении больших торрентов в торрент-клиент файлы-заполнители загружаемого вами торрента фактически создаются на диске, но остаются пустыми до тех пор, пока постепенно не заполнятся в процессе загрузки.

При использовании обычного жесткого диска диск является узким местом, и вы не заметите проблем с производительностью остальной части вашего рабочего стола.

Однако при использовании твердотельного накопителя узким местом является процессор, и приложение, похоже, завершило работу (становится серым). Если вы оставите его на некоторое время, он восстановится, и все будет хорошо. Это был мой опыт с момента перехода на твердотельный накопитель.

Что касается процессов уничтожения, другие дали лучший совет, чем я могу - использование сигнала УНИЧТОЖЕНИЯ обычно работает, но у меня был странный случай, который требовал перезапуска на протяжении многих лет.

Можете ли вы добавить выходные данные ps -o pid, ppid, stat, comm и 'pstree` к вашему вопросу?

Также, пожалуйста, прочтите здесь: process - What are zombie processes? - Ask Ubuntu Это поможет разрешить многие сомнения.

У меня здесь такая же проблема, и после поиска в Google кажется, что это происходит, когда вы зашифровали свою домашнюю папку во время установки и выбрали загрузку торрентов размером более 4 Гб. Я не смог найти никакого другого способа, кроме перезагрузки, чтобы избавиться от процесса зомби, потребляющего 99% процессора. https://bugs .launchpad.net/ubuntu / +source / ecryptfs-utils / + bug / 431975
, похоже, имеет дело с этим, но, похоже, ничего особенного не было сделано для решения этой проблемы :frowning: