Як вбити процес зомбі


184

Я запустив свою програму на передньому плані (програма демон), а потім убив її kill -9, але я отримав зомбі, що залишилося, і я не в змозі його вбити kill -9. Як вбити процес зомбі?

Якщо зомбі - це мертвий процес (вже вбитий), як я його видалити з виводу ps aux?

root@OpenWrt:~# anyprogramd &
root@OpenWrt:~# ps aux | grep anyprogram
 1163 root      2552 S    anyprogramd
 1167 root      2552 S    anyprogramd
 1169 root      2552 S    anyprogramd
 1170 root      2552 S    anyprogramd
10101 root       944 S    grep anyprogram
root@OpenWrt:~# pidof anyprogramd
1170 1169 1167 1163
root@OpenWrt:~# kill -9 1170 1169 1167 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]

2
Що ps -o ppid 1163говорить? Тобто, хто 1163 батько? Це процес, який треба припинити.
Вільям Перселл

Відповіді:


250

Зомбі вже мертве, тому ви не можете його вбити. Щоб прибрати зомбі, його повинен чекати його батько, тому вбивство батька повинно працювати над усуненням зомбі. (Після того, як батько помирає, зомбі успадковується за допомогою pid 1, який зачекає на ньому та очистить його запис у таблицю процесів.) Якщо ваш демон нерестує дітей, які стають зомбі, у вас є помилка. Ваш демон повинен помітити, коли його діти помирають, і waitна них визначити свій статус виходу.

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

# Don't do this.  Incredibly risky sledge hammer!
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')

1
Якщо зомбі - це мертвий процес (вже вбитий), як я його видалити з виводу ps aux?
МОХАМЕД

186
На зомбі повинен чекати його батько. Знайдіть свого батька і з’ясуйте, чому той батько не звертає уваги на своїх дітей, а потім подайте скаргу до соціальних служб. ;)
Вільям Перселл

1
Якщо припустити, що у вас є процес створення багатьох зомбі, є сенс "uniq" ідентифікаторів:kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
ankon

2
як правило, ви можете знайти батьків у PPidрядку, якщо виcat /proc/<pid>/status
Даніель Андрій Мінка

2
Просто уявив, що люди, які не є ІТ, приходять сюди і читають це. Божевільний.
ZitRo

68

Ви можете очистити процес зомбі, вбивши його батьківський процес за допомогою наступної команди:

kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

6
Ця команда очищає зомбі з таблиці процесів, але це не 'вбиває' зомбі. Зомбі вже мертве.
Вільям Перселл

8
grepНе потрібно. ps ... | awk '/[zZ]/{print $2}'
Вільям Перселл

2
AFAICS, ця команда не вбиває зомбі, але надсилає SIGHUP до свого батьківського процесу (імовірно, вбиває батьківського, якщо він не обробляє SIGHUP, і викликає повторне повернення зомбі до init, як описано в попередній відповіді). Тож будьте обережні з цією командою, це може вбити те, чого ви не сподівались ...
Matthijs Kooijman

1
Це не спрацювало для мене. я зробив "убий -HUP processID", і процес все ще є як зомбі
kommradHomer

1
@WilliamPursell, коли ви відповідаєте на запитання, будь ласка, опишіть наслідки використання командного рядка та того, що він робить явно, оскільки він знищує всі програми, що працюють на комп'ютері.
Далек

39

Я намагався:

ps aux | grep -w Z   # returns the zombies pid
ps o ppid {returned pid from previous command}   # returns the parent
kill -1 {the parent id from previous command}

це спрацює :)


в моєму випадку, зомбі створював за допомогою сценарію запуску та програми, яка не була чітко видалена, тому я очистив її.
Мохаммед Рафіе

1
Працювали для мене. Це буде спрацьовувати в певних випадках, коли процес, що не відбувся, був породжений процесом вбитого антре.
Ерік С. Булінгтон

2
Я перевірив, який батьківський процес, перш ніж його вбити. І я щойно вбив це, використовуючи -9 замість -1: убити -9 {батьківський ідентифікатор}
Алі

Мені також довелося використовувати -9, щоб вбити міну замість -1
Майкл Сміт

27

Знайдено на веб- сайті http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-process-574612/

2) Ось чудова порада іншого користувача (Thxs Білл Дандрета): Іноді

kill -9 <pid>

не вб'є процес. Біжи

ps -xal

4-е поле - це батьківський процес, вбийте всіх батьків зомбі, і зомбі вмирає!

Приклад

4 0 18581 31706 17 0 2664 1236 wait S ? 0:00 sh -c /usr/bin/gcc -fomit-frame-pointer -O -mfpmat
4 0 18582 18581 17 0 2064 828 wait S ? 0:00 /usr/i686-pc-linux-gnu/gcc-bin/3.3.6/gcc -fomit-fr
4 0 18583 18582 21 0 6684 3100 - R ? 0:00 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/cc1 -quie

18581, 18582, 18583Зомбі -

kill -9 18581 18582 18583

не має ефекту.

kill -9 31706

видаляє зомбі.


3
добре, що просто вбили initдля мене, і тепер я нічого не можу зробити, і я змушений перезапустити ... процес зомбі - це Java, забираючи 3,4 ГБ з 4 ГБ ОЗУ
Tcll

22

я намагався

kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

і це працює для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.