Як вбити <defunct> процес з батьківським 1


17

Я запускаю Бакулу на коробці RedHat. Час від часу демон зберігання бакули-sd перестає працювати і стає <defunct>.

[root@backup ~]# ps -ef | grep defunct | more
root      4801 29261  0 09:25 pts/5    00:00:00 grep defunct
root      5825     1  0 Oct18 ?        00:00:00 [bacula-sd] <defunct>

Моє запитання: як я можу вбити цей процес? Його батько - 1, що є init, наскільки я знаю, і я не хотів би вбивати процес init, чи не так?

"Зазвичай" вбивство цього процесу не працює:

[root@backup ~]# kill -0 5825
[root@backup ~]# kill -9 5825

Допомога дуже вдячна!

Правка: працює

[root@backup ~]# lsof -p 5825

видає такий вихід:

COMMAND    PID USER   FD   TYPE  DEVICE     SIZE    NODE NAME
bacula-sd 5825 root  cwd    DIR   253,0     4096 3801089 /root
bacula-sd 5825 root  rtd    DIR   253,0     4096       2 /
bacula-sd 5825 root  txt    REG   253,0  2110599  368004 /usr/local/sbin/bacula-sd
bacula-sd 5825 root  mem    REG   253,0    75284  389867 /usr/lib/libz.so.1.2.3
bacula-sd 5825 root  mem    REG   253,0    46680 3604521 /lib/libnss_files-2.5.so
bacula-sd 5825 root  mem    REG   253,0   936908  369115 /usr/lib/libstdc++.so.6.0.8
bacula-sd 5825 root  mem    REG   253,0   125736 3606807 /lib/ld-2.5.so
bacula-sd 5825 root  mem    REG   253,0  1602128 3606885 /lib/libc-2.5.so
bacula-sd 5825 root  mem    REG   253,0   208352 3606892 /lib/libm-2.5.so
bacula-sd 5825 root  mem    REG   253,0   125744 3606887 /lib/libpthread-2.5.so
bacula-sd 5825 root  mem    REG   253,0    25940 3604573 /lib/libacl.so.1.1.0
bacula-sd 5825 root  mem    REG   253,0    15972 3604535 /lib/libattr.so.1.1.0
bacula-sd 5825 root  mem    REG   253,0    46548 3606908 /lib/libgcc_s-4.1.2-20080102.so.1
bacula-sd 5825 root  mem    REG   253,0 56422480  366368 /usr/lib/locale/locale-archive
bacula-sd 5825 root    0r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    1r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    2r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    3u   CHR   9,128             6469 /dev/nst0
bacula-sd 5825 root    4u  IPv4 1023380              TCP backup:bacula-sd (LISTEN)
bacula-sd 5825 root    5u  IPv4 2693268              TCP backup:bacula-sd->backup:53957 (CLOSE_WAIT)
bacula-sd 5825 root    7u  IPv4 3248683              TCP backup:bacula-sd->backup:57629 (CLOSE_WAIT)
bacula-sd 5825 root    8u  IPv4 3250966              TCP backup:bacula-sd->backup:37650 (CLOSE_WAIT)
bacula-sd 5825 root    9u  IPv4 3253908              TCP backup:bacula-sd->backup:37671 (CLOSE_WAIT)

Відповіді:


18

Єдиний спосіб, коли ви могли б усунути процес зомбі / неіснуючого, - це вбити батьків. Оскільки батьків є init (Pid 1), це також зніме вашу систему.

Це в значній мірі залишає у вас два варіанти.

  • Вручну змінюйте таблицю процесів, наприклад. створіть манекеновий процес, зв’яжіть процес, що не відбувся, як дитина манекена, а потім знищити їх. Досить небезпечно, і вам, можливо, доведеться вручну очищати інші технологічні ресурси, такі як семафори та ручки файлів.
  • Перезавантажте систему.

Я б пішов з другим.


2
+1. Однак не потрібно поспішати робити, доки не з'являться більше зомбі-процесів або ваш зомбі не заблокував 4G оперативної пам’яті. :)
Кайл Сміт

1
"Оскільки батьків є init (pid 1), це також зніме вашу систему" - Ви не можете вбити, initоскільки у нього немає обробника сигналу для SIGKILL. Див man 2 kill.
Cawflands

Як ви робите перше?
skerit

@AndrewH Я не впевнений, що SIGKILL залежить від обробника сигналу в цільовому процесі, але це правда, що типове ядро ​​буде ігнорувати SIGKILL для init. Однак якщо вам не вистачає більш холодних способів викликати паніку ядра, я думаю, ви виявите, що в більшості систем Linux SIGSEGV зробить досить непогано.
Рой

1
Слід зазначити, що одним із initзавдань є пожинання процесів зомбі, тому, якщо ви будете чекати досить довго, initслід очистити зомбі. Хоча, більшість inits має встановити обробник, SIGCHLDякий буде SIG_IGN виправляти це.
cyphar

3

Ви можете спробувати перезапустити init:

 # telinit u

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


1
ну, я, таким чином, маю хвилюватися. це виробнича машина, що працює з резервними копіями (бакула) та VoIP (зірочка). до тих пір, поки там є процес, що не працює, bacula-sd, бакула, здається, не може отримати доступ до магнітоли ...
andreas-h

У ньому не повинно бути відкритих файлів. Запустіть lsof -p 5825 і перевірте.
Девід Пашлі

Що ж, здається, відкривається багато речей ... дивіться вище. Якісь ідеї, що я можу зробити? Я ніколи не використовував lsof ...
andreas-h

1
Так, ваш зомбі відкритий / dev / nst0. Перезавантаження системи, мабуть, найкраща ставка на даний момент.
Кайл Сміт

5
Так, перезавантаження, здається, є переважаючою відповіддю. Я завжди відчуваю, що не зміг, коли мені доведеться перезавантажити сервер. :(
Девід Пашлі

3

Перевірте, чи була паніка ядра,

# dmesg |tail

Перевірте, чи перебуває процес у режимі "D" Неможливий сон, де він перебуває в режимі ядра для якогось syscall, який ще не повернувся (або ядро, або інша причина) http://www.nabble.com/What-causes-an -unkillable-process - td20645581.html


докучливе форматування
asdmin

насправді не було паніки з ядром. процес знаходиться в стані "Z" - зомбі ...
andreas-h

3

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


Я згоден про те, що init не працює належним чином. Дивіться також: upstartі systemd.
Mikko Rantalainen

2

Давайте втримаємо паніку, чи не так? Процес "неіснуючого" або "зомбі" - це не процес . Це просто запис у таблицю процесу із збереженим кодом виходу. Таким чином, зомбі не містить ресурсів, не займає процесорних циклів і не використовує пам'ять, оскільки це не процес . Не отримуйте всіх дивних і сверблячих, намагаючись "вбити" зомбі-процеси. Так само, як і їхні тезки, їх не можна вбити, оскільки вони вже мертві. Але на відміну від їжі, яка їсть мозок, вони нікому не шкодять, а інші процеси не кусають.

Не дозволяйте процесам зомбі їсти ваш мозок. Просто ігноруйте їх.


11
Так, це теорія. На жаль, це не завжди так. Процес неіснуючого процесу іноді зависає до системних ресурсів, як, наприклад, andreash чітко підтвердив.
Рой

5
У його випадку, за результатами lsof, процес зомбі їсть мізки / dev / nst0. Йому потрібні ці мізки для продовження операцій із резервного копіювання.
Кайл Сміт

2
Системний адміністратор, який проводить свою кар’єру, ігноруючи процеси зомбі, врешті-решт прокинеться посеред ночі, і їх життя висмоктується з них. Зомбі, на мій досвід, свідчить про щось не так. Я пишу це навіть як дитина-зомбі має якусь дивну взаємодію зі своїм батьком, і батько обертає мій процесор. Я не знаю, в чому винна, але справа в тому, що зомбі некрасиві, і колись їх ігнорування прийде переслідувати. ... Одного разу ... коли ти спокійно спиш ... посеред ночі ... після холодного осіннього дня ...
Майк Ш

@MikeS Я добре посміявся з вашого коментаря!
Пол Калабро

@MikeS має право. У мене ssh-agent не працює, і ssh ні git не можуть працювати належним чином. тільки перезапуск може допомогти. (те саме виправлення, що і Windows має ... ха-ха)
Джон Плем'я

0

Здається, у вас є сиротний процес. Наскільки я знаю, єдиним способом убити це було б перезавантажити коробку. У мене це час від часу траплялося на моїх серверах ESX (які є Linux під кришкою), і виправлення перезавантаження хоста (від підтримки VMware).

Я хлопець з Windows, тому прийміть це за те, що його варто.


на жаль, перезавантаження не є реальним варіантом. це виробнича машина, яка також працює на сервісах VoIP, тому я не можу перезавантажити її в
робочий

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