Есть ли способ убить зомби-процесс без перезагрузки?
Есть ли способ убить зомби-процесс без перезагрузки? Вот как это произошло:
Я хочу скачать файл 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 на него не сработало.
5 ответов
Я не думаю, что процесс зомби - большая головная боль. Процесс зомби не требует никаких ресурсов. Просто у него есть запись в таблице процессов.
Процесс 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, без которого ваша система не может работать
С помощью kill
сам процесс действительно неэффективен, так как процесс уже мертв; kill
приносит живой процесс в состояние зомби.
Родительский процесс отвечает за выбор кода завершения процесса; процесс остается зомби, пока это не будет сделано. init
process выберет код завершения любого процесса и выбросит его, так что именно родитель "последней инстанции" очистит любого зомби, который является прямым потомком.
Убийство родителя процесса зомби обычно эффективно, потому что процесс зомби затем возвращается к init
как его родитель, как только родительский процесс ушел (то есть, убийство родителя превратило этот процесс в зомби, а дедушка прочитал код выхода родителя, поэтому родитель действительно исчез). Зомби может быть родителем зомби, поэтому простого убийства родителя недостаточно, его также необходимо собрать другим процессом.
Обратите внимание, что процессы никогда не отвечают за очистку своих внуков - они всегда возвращаются к процессу 1 в качестве родительского (именно поэтому авторы демонов иногда используют двойную ветвь () и завершают процесс в середине, чтобы полностью отделить дочерний процесс от вызывающего ракушка)
Причина убийства wine
вероятно, неэффективен, потому что это не было действительно родителем процесса зомби; скорее, "utorrent.exe", который является прямым потомком init. Этот процесс, однако, все еще работает нормально, просто пренебрегая своими обязанностями.
Намного проще, чем killall, -9 и т. Д.
1) Используйте qBitorrent вместо консоли uTorrent (я тоже жду версию с графическим интерфейсом, и qBitorrent по сути это).
2) Если вы используете 11.04 или выше, нажмите alt+f2 (откроется специальное окно команд), введите xkill, и ваша мышь теперь будет х. Нажмите на программу, которую вы хотите закрыть (UI = ID процесса), и она убьет ее для вас.
Расширенный совет: свяжите сочетание клавиш для "xkill", как у меня на макроклавиатуре G15.
В моем случае, когда вино висит, и я не могу убить ребенка-зомби из дробовика, я бы сделал:
wineserver -k
тогда я убил бы "Сына Процесса" killall -9 Oblivion.exe
(Например)
Насколько я понимаю, винсервер посылает сигнал всем своим детям-зомби, что они все умрут (из-за дробовика, который вы знаете), но иногда ребенок думает сам по себе и хочет захватить мир штурмом. Так что я делаю дополнительный killall -9
или kill -9
с идентификатором процесса.
Я предполагаю, что вы используете SSD.
При добавлении больших торрентов в торрент-клиент загружаемые файлы торрента фактически создаются на диске, но они пусты до тех пор, пока не будут постепенно заполнены в процессе загрузки.
При обычном жестком диске этот диск является узким местом, и вы не заметите проблем с производительностью остального рабочего стола.
Однако при использовании твердотельного накопителя узким местом является центральный процессор, и приложение, по-видимому, зависло (становится серым). Если вы оставите его на некоторое время, оно восстановится, и все будет хорошо. Это был мой опыт с момента перехода на SSD.
Что касается процессов уничтожения, другие предоставили лучший совет, чем я - использование сигнала KILL обычно работает, но у меня был странный сигнал, который требовал перезапуска в течение многих лет.