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

44

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

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

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

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

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

Edit:

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 18.03.2011 в 10:11
источник

5 ответов

36

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

Процесс Zombie не является сиротским процессом, у него есть родительский.

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

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

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

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

  

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

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

EDIT 2: цитата из Википедии

  

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

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

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

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

Попробуйте выполнить killall utorrent.exe

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

EDIT 4

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

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

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

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

  

ps -e | grep -i utorrent

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

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

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

  

kill -9 yyyy

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

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

  

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

в вашем случае

  

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

Если выход приходит как

  

PPid: 1

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

    
ответ дан Manish Sinha 18.03.2011 в 11:52
источник
9

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

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

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

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

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

    
ответ дан Simon Richter 18.03.2011 в 15:10
3

Гораздо проще, чем killall, -9 и т. д .:

1) Используйте вместо qpitorrent вместо qBitorrent (я тоже жду версию GUI, а qBitorrent - это она).

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

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

    
ответ дан d4m1r 20.10.2011 в 20:01
1

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

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

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

    
ответ дан Luis Alvarado 18.03.2011 в 16:56
-4

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

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

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

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

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

ответ дан user12746 21.03.2011 в 07:59