Jak zabić <niedziałający> proces z rodzicem 1

17

Używam Baculi na pudełku RedHat. Od czasu do czasu demon pamięci bacula-sd przestaje działać i staje się <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>

Moje pytanie brzmi: jak mogę zabić ten proces? Jego rodzic ma 1, czyli init, o ile wiem, i nie chciałbym zabijać procesu inicjacji, prawda?

„Normalnie” zabicie tego procesu nie działa:

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

Bardzo doceniamy pomoc!

Edycja: uruchomiona

[root@backup ~]# lsof -p 5825

produkuje następujące dane wyjściowe:

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)
andreas-h
źródło

Odpowiedzi:

18

Jedynym sposobem na usunięcie zombie / nieistniejącego procesu byłoby zabicie rodzica. Ponieważ rodzicem jest init (pid 1), spowoduje to również uszkodzenie twojego systemu.

To prawie pozostawia dwie opcje.

  • Ręcznie zmodyfikuj tabelę procesów, np. utwórz proces obojętny, połącz nieistniejący proces jako dziecko obojętnego, a następnie zabij go. Jest to dość niebezpieczne i może być konieczne ręczne wyczyszczenie innych zasobów procesu, takich jak semafory i uchwyty plików.
  • Uruchom ponownie system.

Poszedłbym z drugim.

Roy
źródło
2
+1. Jednak nie trzeba się spieszyć, dopóki nie pojawi się więcej procesów zombie lub proces zombie nie zablokował 4G pamięci RAM. :)
Kyle Smith,
1
„Ponieważ rodzicem jest init (pid 1), to także zniszczyłoby twój system” - Nie możesz zabić, initponieważ nie ma on obsługi sygnału dla SIGKILL. Zobaczyć man 2 kill.
Cawflands
Jak robisz pierwszy?
skerit
@AndrewH Nie jestem pewien, czy SIGKILL zależy od procedury obsługi sygnału w procesie docelowym, ale prawdą jest, że typowe jądro zignoruje SIGKILL, aby zainicjować. Jeśli jednak zabraknie Ci fajniejszych sposobów na wywołanie paniki jądra, myślę, że przekonasz się, że w większości systemów Linux SIGSEGV poradzi sobie całkiem nieźle.
Roy
1
Należy zauważyć, że jednym z initzadań jest zbieranie procesów zombie, więc jeśli zaczekasz wystarczająco długo, initoczyść procesy zombie. Chociaż większość inits powinna ustawić program obsługi SIGCHLDna be, SIG_IGN który to naprawia.
cyphar
3

Możesz spróbować zrestartować init:

 # telinit u

W przeciwnym razie nie martwiłbym się zbytnio. Nie działa i nie zużywa żadnych zasobów, a jest po to, aby jądro mogło je zapamiętać.

David Pashley
źródło
1
Cóż, muszę się martwić. to maszyna produkcyjna obsługująca usługi tworzenia kopii zapasowych (Bacula) i VoIP (Asterisk). tak długo, jak długo istnieje niedziałający proces Bacla-SD, Bacula nie może uzyskać dostępu do napędu taśmowego
Andrea-h
Nie powinien mieć żadnych otwartych plików. Uruchom lsof -p 5825 i sprawdź.
David Pashley,
Wydaje się, że wiele rzeczy jest otwartych ... patrz wyżej. Jakieś pomysły, co mogę zrobić? Nigdy nie korzystałem z lsof ...
andreas-h
1
Tak, twój zombie ma / dev / nst0 otwarty. Ponowne uruchomienie systemu jest prawdopodobnie najlepszym wyborem w tym momencie.
Kyle Smith,
5
Tak, ponowne uruchomienie wydaje się być dominującą odpowiedzią. Zawsze mam wrażenie, że zawiodłem, gdy muszę zrestartować serwer. :(
David Pashley,
3

Sprawdź, czy wystąpiła panika jądra,

# dmesg |tail

Sprawdź, czy proces znajduje się w stanie uśpienia „D”, w którym znajduje się w trybie jądra dla jakiegoś połączenia systemowego, które jeszcze nie powróciło (albo jądro przestało działać, albo z innego powodu) http://www.nabble.com/What-causes-an -unkillable-process - td20645581.html

Wstrzymano do odwołania.
źródło
irytujące formatowanie
asdmin,
właściwie nie było paniki w jądrze. proces jest w stanie „Z” - zombie ...
andreas-h
3

Jeśli zombie ma init jako jego rodzic, wówczas init przestał działać poprawnie. Jedną z ról init jest usuwanie zombie. Jeśli tego nie zrobi, nikt inny tego nie zrobi. Więc jedynym rozwiązaniem jest ponowne uruchomienie. Jeśli init jest uszkodzony, ponowne uruchomienie może się nie powieść, więc zamknę ważne usługi, zsynchronizuj system plików, a następnie naciśnij przycisk zasilania.

MarkR
źródło
Zgadzam się, że init nie działa poprawnie. Zobacz także: upstarti systemd.
Mikko Rantalainen,
2

Zatrzymajmy panikę, prawda? Proces „zlikwidowany” lub „zombie” nie jest procesem . Jest to po prostu wpis w tabeli procesów z zapisanym kodem wyjścia. Zatem zombie nie ma zasobów, nie bierze cykli procesora i nie zużywa pamięci, ponieważ nie jest to proces . Nie bądź dziwny i swędzący, próbując „zabić” procesy zombie. Podobnie jak ich imienniki, nie można ich zabić, ponieważ już nie żyją. Ale w przeciwieństwie do osób jedzących mózg, nie szkodzą absolutnie nikomu i nie ugryzą innych procesów.

Nie pozwól, aby procesy zombie zjadły twój mózg. Po prostu ich ignoruj.

Miś
źródło
11
Tak, to jest teoria. Niestety nie zawsze jest to prawda. Nieaktualny proces czasami zawiesza się w zasobach systemowych, tak jak andreash wyraźnie to udokumentował.
Roy,
5
W jego przypadku, zgodnie z wyjściem lsof, proces zombie zjada mózgi / dev / nst0. Potrzebuje tych mózgów, aby kontynuować operacje tworzenia kopii zapasowych.
Kyle Smith,
2
Administrator systemu, który spędza swoją karierę ignorując procesy Zombie, w końcu obudzi się w środku nocy, a ich życie zostanie z nich wyssane. Zombie z mojego doświadczenia wynika, że ​​coś jest nie tak. Piszę je nawet wtedy, gdy dziecko zombie ma dziwną interakcję z rodzicem, a rodzic kręci moim procesorem. Nie wiem, czyja to wina, ale chodzi o to, że zombie są brzydkie, a ich zignorowanie kiedyś nadejdzie. ... Pewnego dnia ... kiedy śpisz spokojnie ... w środku nocy ... po zimnym jesiennym dniu ...
Mike S
@MikeS Mam dobry śmiech z twojego komentarza!
Paul Calabro
@MikeS ma rację. Mam ssh-agent zlikwidowany i ssh ani git nie mogą działać poprawnie. tylko ponowne uruchomienie może pomóc. (ta sama poprawka, co Windows ma ... haha)
John Tribe
0

Wygląda na to, że masz osierocony proces. O ile wiem, jedynym sposobem na zabicie ich byłoby ponowne uruchomienie urządzenia. Od czasu do czasu zdarzało mi się to na moich serwerach ESX (które są linux pod maską), a ponowne uruchomienie hosta jest naprawą (z obsługi VMware).

Jestem facetem z Windows, więc weź to za swoją wartość.

mrdenny
źródło
niestety ponowne uruchomienie nie jest realną opcją. to maszyna produkcyjna obsługująca również usługi VoIP, więc nie mogę jej ponownie uruchomić w godzinach pracy ...
andreas-h
1
więc możesz go ponownie uruchomić po godzinach pracy, prawda?
warren