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

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 не сработало.

Pedram
источник
Можете ли вы добавить вывод ps -o pid,ppid,stat,commи pstreeна ваш вопрос?
Микель
У меня такая же проблема, и после поиска в Google кажется, что это происходит, когда во время установки зашифровывается ваша домашняя папка и выбирается загрузка торрентов размером более 4 ГБ. Я не смог найти другого способа, кроме перезагрузки, чтобы избавиться от процесса зомби, съедающего 99% процессорного времени. bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/431975, кажется, имеет дело с этим, но, похоже, ничего не было сделано для решения этой проблемы :(
user972876
Также, пожалуйста, прочитайте здесь: askubuntu.com/questions/48624/what-are-zombie-processes Это поможет решить многие сомнения.
Луис Альварадо

Ответы:

41

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

Процесс Zombie - это не процесс-сирота, у него есть родитель.

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 процесса PID

ps -e | grep -i utorrent

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

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

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

убить -9 гггг

РЕДАКТИРОВАТЬ 5

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

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

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

cat / proc / 7298 / status | 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
Да уж. Я обновил пост, чтобы было понятно, что я имел в виду.
Маниш Синха
7
Процесс зомби полностью занимает одно из моих процессорных ядер. Использование этого ядра на 100%. Так что это не только запись в таблице процессов. Я добавлю дополнительную информацию к вопросу.
Pedram
3
Зомби, использующий процессор, может запускать фоновые потоки. Попробуйте использовать top -Hдля отображения темы вместо процессов в верхней.
Зан Рысь,
1
Основная проблема с несуществующими процессами состоит в том, что они продолжают использовать в конечном итоге используемые порты.
Пиетровисмара
10

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

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

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

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

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

Саймон Рихтер
источник
Спасибо за информацию. Но какое решение?
Pedram
1
Убивает реальный родительский процесс, то есть тот, который ps wauxуказан в PPIDстолбце для зомби.
Саймон Рихтер
Как вы можете видеть в выводе pstree, у "utorrent.exe" нет родителя.
Pedram
Есть два процесса с таким именем, где один является дочерним по отношению к другому. Я подозреваю, что зомби - это ребенок, который сделает родительский процесс "utorrent.exe" ответственным за очистку; если вы убьете этот процесс, тогда init очистит родительский объект, после чего дочерний объект будет снова присоединен к init и также немедленно очищен.
Саймон Рихтер
В этом случае killall не работал. Я запустил µTorrent сейчас, и у него нет ни одного родителя или потомка, но его пока нельзя убить. Вывод pstree обновлен.
Pedram
3

Намного проще, чем killall, -9 и т. Д.

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

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

Расширенный совет: свяжите сочетание клавиш для «xkill», как у меня на макроклавиатуре G15.

d4m1r
источник
1

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

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

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

Луис Альварадо
источник
Это тоже не сработало. Кроме передачи и кторрента есть та же проблема, и они не имеют ничего общего с вином.
Pedram
Я упомянул часть об использовании utorrent с вином, являющимся вином родителем и utorrent ребенком. В любом случае вы пытались отправить сигнал родителю, сообщив ему, что его ребенок - зомби (что-то, к чему не готов ни один из родителей). Например:kill -s SIGCHLD ppid
Луис Альварадо
Также, какой тип оборудования у вас есть, это может помочь выяснить, как зомби может максимально использовать ресурсы.
Луис Альварадо
К сожалению, тоже не работает.
Pedram
Мой процессор - Core i7 860.
Pedram
-4

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

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

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

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

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


источник
1
Спасибо, но я использую обычный жесткий диск.
Педрам
1
«Однако при использовании твердотельного накопителя узким местом является центральный процессор, и кажется, что приложение зависло (становится серым). Если вы оставите его на некоторое время, оно восстановится, и все будет хорошо». В такой ситуации процесс не зомби. Зомби-процессы и процессы в непрерывном сне не одно и то же. Процесс зомби действительно больше не работает, не требует ресурсов (кроме одной записи в таблице процессов) и не может вернуться к жизни.
Элия ​​Каган,