Как убить процесс <defunct> с родителем 1

17

Я запускаю Bacula на коробке RedHat. Время от времени, демон хранения bacula-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
Как ты делаешь первый?
скерит
@AndrewH Я не уверен, что SIGKILL зависит от обработчика сигнала в целевом процессе, но это правда, что типичное ядро ​​игнорирует SIGKILL для инициализации. Однако, если у вас не хватит более холодных способов вызвать панику ядра, я думаю, вы обнаружите, что в большинстве систем Linux SIGSEGV будет работать довольно хорошо.
Рой
1
Следует отметить, что одной из initзадач является сбор процессов зомби, поэтому, если вы подождете достаточно долго, initочистите процессы зомби. Хотя большинство inits должно устанавливать обработчик SIGCHLD, SIG_IGN который исправляет это.
cyphar
3

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

 # telinit u

В противном случае я бы не слишком волновался. Он не работает и не потребляет никаких ресурсов, он просто существует, чтобы ядро ​​могло его запомнить.

Дэвид Пашли
источник
1
ну, я вроде должен волноваться. это производственная машина, на которой запущены службы резервного копирования (bacula) и voip (звездочка). пока существует не существующий процесс bacula-sd, bacula не может получить доступ к ленточному накопителю ...
andreas-h
Там не должно быть открытых файлов. Запустите lsof -p 5825 и проверьте.
Дэвид Пашли
Что ж, похоже, многое открыто ... см. Выше. Есть идеи, что я могу сделать? Я никогда не использовал lsof ...
andreas-h
1
Да, у вашего зомби открыт / dev / nst0. Перезагрузка системы, вероятно, лучшая ставка на данный момент.
Кайл Смит
5
Да, перезагрузка кажется преобладающим ответом. Я всегда чувствую, что потерпел неудачу, когда мне нужно перезагрузить сервер. :(
Дэвид Пашли
3

Проверьте, не было ли паники ядра,

# dmesg |tail

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

Приостановлено до дальнейшего уведомления.
источник
раздражающее форматирование
asdmin
на самом деле не было никакой паники ядра. процесс находится в состоянии 'Z' - зомби ...
andreas-h
3

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

MarkR
источник
Я согласен с тем, что init не работает должным образом. Смотрите также: upstartи systemd.
Микко Ранталайнен,
2

Давайте сдерживать панику, не так ли? «Несуществующий» или «зомби» процесс - это не процесс . Это просто запись в таблице процессов с сохраненным кодом выхода. Таким образом, зомби не держит ресурсов, не берет циклов ЦП и не использует память, поскольку это не процесс . Не пытайтесь «убить» зомби-процессы. Как и их тезки, их нельзя убить, потому что они уже мертвы. Но в отличие от тех, кто питается мозгами, они абсолютно никому не вредят и не будут кусать другие процессы.

Не позволяйте зомби-процессам съесть ваш мозг. Просто игнорируй их.

Тедди
источник
11
Да, это теория. К сожалению, это не всегда так. Не функционирующий процесс иногда будет зависеть от системных ресурсов, как это четко документировал andreash.
Рой
5
В его случае, согласно выводу lsof, зомби-процесс пожирает мозги / dev / nst0. Ему нужны эти мозги для продолжения операций резервного копирования.
Кайл Смит
2
Системный администратор, который проводит свою карьеру, игнорируя процессы зомби, в конце концов проснется посреди ночи, когда их жизнь высосется из них. Зомби, по моему опыту, свидетельствует о том, что что-то не так. Я пишу это даже тогда, когда ребенок-зомби странно взаимодействует со своим родителем, а родитель вращает мой процессор. Я не знаю, чья это вина, но дело в том, что зомби безобразны, и если их игнорировать, однажды они будут преследовать тебя. ... Однажды ... когда вы мирно спите ... посреди ночи ... после холодного осеннего дня ...
Майк С.
@MikeS Я получил хороший смех от вашего комментария!
Пол Калабро
@MikeS имеет право. У меня не работает ssh-agent, и ssh или git не могут работать должным образом. только перезагрузка может помочь. (такое же исправление, как у окон ... хаха)
Джон Трайб
0

Похоже, у вас есть осиротевший процесс. Насколько я знаю, единственный способ убить их - перезагрузить коробку. У меня это происходило на моих серверах ESX (которые являются linux под капотом) время от времени, и перезагрузка хоста - это исправление (из поддержки VMware).

Я парень из Windows, поэтому возьмите это за то, что оно того стоит.

mrdenny
источник
к сожалению, перезагрузка не является реальной возможностью. это производственный компьютер, на котором также работают службы VoIP, поэтому я не могу перезагрузить его в рабочее время ...
andreas-h
1
Итак, вы можете перезагрузить его в нерабочее время, верно?
Уоррен