Як вбити процес, який неможливо вбити без перезавантаження?


11

Існує 5 процесів, які не можуть бути вбиті, kill -9 $PIDа виконання cat /proc/$PID/cmdlineбуде вивішувати поточну сесію. Можливо, вони зомбі-процеси.

Виконання ps -ef or htopтакож буде висіти поточний сеанс. Але topі ps -eпрацюють нормально.

Тому, схоже, є дві проблеми, на які файлова система не відповідає.

Це виробнича машина під управлінням віртуальних машин, тому перезавантаження не є можливим.

Наступні ідентифікатори процесів не працюють: 16181 16765 5985 7427 7547

Батьком цих процесів є init

        ├─collectd(16765)─┬─{collectd}(16776)
        │                 ├─{collectd}(16777)
        │                 ├─{collectd}(16778)
        │                 ├─{collectd}(16779)
        │                 ├─{collectd}(16780)
        │                 └─{collectd}(16781)
        ├─collectd(28642)───{collectd}(28650)
        ├─collectd(29868)─┬─{collectd}(29873)
        │                 ├─{collectd}(29874)
        │                 ├─{collectd}(29875)
        │                 └─{collectd}(29876)

І один з процесів qemu не працює

|-qemu-system-x86(16181)-+-{qemu-system-x86}(16232)
|                        |-{qemu-system-x86}(16238)
|                        |-{qemu-system-x86}(16803)
|                        |-{qemu-system-x86}(17990)
|                        |-{qemu-system-x86}(17991)
|                        |-{qemu-system-x86}(17992)
|                        |-{qemu-system-x86}(18062)
|                        |-{qemu-system-x86}(18066)
|                        |-{qemu-system-x86}(18072)
|                        |-{qemu-system-x86}(18073)
|                        |-{qemu-system-x86}(18074)
|                        |-{qemu-system-x86}(18078)
|                        |-{qemu-system-x86}(18079)
|                        |-{qemu-system-x86}(18086)
|                        |-{qemu-system-x86}(18088)
|                        |-{qemu-system-x86}(18092)
|                        |-{qemu-system-x86}(18107)
|                        |-{qemu-system-x86}(18108)
|                        |-{qemu-system-x86}(18111)
|                        |-{qemu-system-x86}(18113)
|                        |-{qemu-system-x86}(18114)
|                        |-{qemu-system-x86}(18119)
|                        |-{qemu-system-x86}(23147)
|                        `-{qemu-system-x86}(27051)

1
Процеси зомбі не повинні викликати проблем. Якщо кількість процесів зомбі настільки велика, що перевищує ліміт процесів на сервері, це призведе до проблеми.
Раза

@Salton: Ми не можемо використовувати ps -ef і htop, тому у нас є деякі проблеми, можливо, те, що ми бачимо, не називається процесом зомбі?
Сем Столінгя

1
Ви можете спробувати простежити, використовуючи, /usr/bin/strace ps -efщоб побачити, де саме ps -efвисить ваш .
Раза

2
Як ти визначив, що це зомбі? Це швидше виглядає як висячі процеси. Чи ps -elпрацює і в якому стані перебувають ці процеси?
Нілс

Зрештою клієнт все ж вирішив перезавантажити машину, оскільки проблеми ставали все гіршими та гіршими. Дякую за весь вклад. Дізналися багато про зомбі та безперебійні процеси.
Сем Столінгя

Відповіді:


22

У вас немає зомбі. cat /proc/$PID/cmdlineне було б жодних проблем із зомбі. Якщо програма kill -9не вбиває програму , це означає, що програма виконує операції безперебійного вводу / виводу. Зазвичай це означає одну з трьох речей:

  • мережева файлова система, яка не відповідає;
  • помилка ядра;
  • апаратний помилку.

Утиліти, такі як, psможливо, зависають, якщо вони намагаються прочитати певну інформацію, таку як виконавчий шлях процесу, який ядро ​​не забезпечує з однієї з причин, зазначених вище.

Спробуйте cat /proc/16181/syscallпобачити, яким процесом 16181 займається. Це може бути, а може і не працювати, залежно від того, наскільки далеко зайшла ваша система.

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


Кіт ніколи не реагує. Я не думаю, що це помилка. Я думаю, що це "особливість".
Сова

7

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

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


Занадто багато процесів зомбі можуть перешкодити forkдосягти успіху (коли важко nrpocдосягти), оскільки вони все ще займають місце в таблиці процесів.
dhchdhd

2

Щоб знайти процеси зомбі в Linux:

$ ps axo stat, ppid, pid, comm | grep -w неіснуючий

Z 555 10242 Чорт-зомбі <неіснуючий>

По-перше, ви можете спробувати надіслати сигнал SIGCHLD до батьківського процесу зомбі за допомогою команди kill. Зауважте, що вищевказана команда дає вам PPID (PID батьківського процесу) кожного зомбі. У нашому прикладі PPID зомбі є 555.

$ sudo kill -s SIGCHLD 555

Якщо процес зомбі все ще не проходить, ви можете вбити батьківський процес (наприклад, 555) зомбі.

$ sudo kill -9 555

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


Це справжня відповідь. Вбивство батьків працювало, дякую.
Андрій

1

Вбити зомбі можна лише вбивши його батька. Процес зомбі звільнив усі свої ресурси і чекає, коли його вихідний статус підбере його батько. Це стає зомбі, коли батько не виконує а, waitщоб забрати статус виходу у своєї дитини. Коли ви вбиваєте батька зомбі, initвибирає статус виходу, і зомбі нарешті вмирає.


Так ти хочеш, щоб я вбив Ініта? З питання незрозуміло вибачте, хе-хе, але, схоже, батько є
інітом

4
Ні, ми хочемо, щоб ви не намагалися вбити зомбі. Ви не можете вбити зомбі. Цей FAQ старий, як і сам Unix.
tripleee

@tripleee: Так, я зрозумів. Можливо, те, що у мене є, не є зомбі. htop не працює, а cat / proc / $ pid / cmdline або ls / proc / $ pid / також не працює. Зазвичай цього не відбувається із зомбі, ось чому я запитав тут, це не є загальною проблемою ІМО. Я перевірив декілька відповідей, які всі кажуть тобі вбити батьків, що є в моєму випадку або перезавантажити.
Сем Столінгя

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