Jak zabić proces, którego nie można zabić bez ponownego uruchomienia?


11

Istnieje 5 procesów, których nie można zabić, kill -9 $PIDa wykonanie cat /proc/$PID/cmdlinespowoduje zawieszenie bieżącej sesji. Może to procesy zombie.

Wykonanie ps -ef or htopspowoduje także zawieszenie bieżącej sesji. Ale topi ps -edziałają dobrze.

Wygląda więc na to, że system plików nie reaguje na dwa problemy.

Jest to maszyna produkcyjna z maszynami wirtualnymi, więc ponowne uruchomienie nie jest opcją.

Następujące identyfikatory procesów nie działają: 16181 16765 5985 7427 7547

Rodzicem tych procesów jest 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)

I jeden z procesów qemu nie działa

|-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
Procesy zombie nie powinny powodować problemów. Jeśli liczba procesów Zombie jest tak duża, że ​​przekracza limit procesów na serwerze, spowoduje to problem.
Raza

@Salton: Nie możemy używać ps -ef i htop, więc mamy pewne problemy, może to, co widzimy, nie nazywa się procesem zombie?
Sam Stoelinga

1
Możesz spróbować prześledzić, używając, /usr/bin/strace ps -efaby zobaczyć, gdzie dokładnie ps -efwisi twój .
Raza

2
Jak ustaliłeś, że to zombie? To raczej wygląda na proces zawieszania. Czy ps -eldziała i w jakim stanie są te procesy?
Nils

Ostatecznie klient nadal postanowił zrestartować maszynę, ponieważ problemy pogłębiały się. Dzięki za cały wkład. Dowiedziałem się wiele o zombie i nieprzerwanych procesach.
Sam Stoelinga,

Odpowiedzi:


22

Nie masz zombie. cat /proc/$PID/cmdlinenie miałby żadnego problemu z zombie. Jeśli kill -9nie zabije programu , oznacza to, że program wykonuje pewne nieprzerwane operacje we / wy. Zazwyczaj oznacza to jedną z trzech rzeczy:

  • sieciowy system plików, który nie odpowiada;
  • błąd jądra;
  • błąd sprzętowy.

Narzędzia takie jak psmogą się zawiesić, jeśli spróbują odczytać pewne informacje, takie jak ścieżka wykonywalnego procesu, której jądro nie podaje z jednego z powyższych powodów.

Spróbuj cat /proc/16181/syscallzobaczyć, co robi proces 16181. To może, ale nie musi działać, w zależności od tego, jak daleko zaszedł twój system.

Jeśli problemem jest sieciowy system plików, być może możesz wymusić jego odmontowanie lub przełączyć na tryb online. Jeśli problemem jest błąd jądra lub sprzętu, to, co możesz zrobić, będzie zależeć od charakteru błędu. Zdecydowanie zalecane jest ponowne uruchomienie (i uaktualnienie do naprawionego jądra lub wymiana uszkodzonego sprzętu).


Kot nigdy nie reaguje. Nie sądzę, że to błąd. myślę, że to „funkcja”.
Owl

7

Inne odpowiedzi zakładają, że są to procesy zombie. Proces zombie jest procesem, który się zakończył, ale nadal znajduje się w tabeli procesów, na wypadek, gdyby rodzic chciał poznać status wyjścia. Są to normalne i initautomatycznie usuwają przypisane do nich procesy zombie.

Procesy zombie nigdy nie powinny powodować zawieszania czegokolwiek, więc wygląda na to, że to nie może być twój problem. Jeśli jest to zawieszenie wywołania systemowego lub sterownika, proces może być w stanie nieprzerwanym. Jest to dobre wyjaśnienie tutaj .


Zbyt wiele procesów zombie może uniemożliwić forkpowodzenie (gdy nrpoczostanie osiągnięty trudny poziom), ponieważ nadal zajmują miejsce w tabeli procesów.
dhchdhd

2

Aby znaleźć procesy zombie w systemie Linux:

$ ps axo stat, ppid, pid, comm | grep -w nieczynny

Z 555 10242 Damn-Zombie <nieistniejący>

Najpierw możesz spróbować wysłać sygnał SIGCHLD do procesu nadrzędnego zombie za pomocą polecenia kill. Zauważ, że powyższe polecenie podaje PPID (PID procesu nadrzędnego) każdego zombie. W naszym przykładzie PPID zombie to 555.

$ sudo kill -s SIGCHLD 555

Jeśli proces zombie nadal nie znika, możesz zabić proces nadrzędny (np. 555) zombie.

$ sudo kill -9 555

Gdy proces nadrzędny zostanie zabity, zombie zostanie adoptowane przez proces init, który jest rodzicem wszystkich procesów w Linuksie. Proces inicjacji okresowo wzywa wait()do czerpania dowolnego procesu zombie.


To jest prawdziwa odpowiedź. Zabicie rodzica zadziałało, dzięki.
Andrew

1

Możesz zabić zombie tylko zabijając jego rodzica. Proces zombie uwolnił wszystkie swoje zasoby i czeka na jego status wyjścia, który zostanie odebrany przez jego rodzica. Staje się zombie, gdy rodzic nie wykonuje polecenia a, waitaby odebrać status wyjścia od swojego dziecka. Kiedy zabijesz rodzica zombie, initpodnosi status wyjścia i zombie w końcu umiera.


Więc chcesz, żebym zabił inicjatora? Nie jest jasne z pytania przepraszam hehe, ale rodzic wydaje się być init :( Zredagowałem pytanie.
Sam Stoelinga

4
Nie, chcemy, żebyś nie próbował zabić zombie. Nie możesz zabić zombie. To FAQ jest tak stare jak sam Unix.
tripleee

@tripleee: Tak właśnie to zrozumiałem. Może to, co mam, nie jest zombie. htop nie działa i cat / proc / $ pid / cmdline lub ls / proc / $ pid / również nie działa. Zwykle nie dzieje się tak z zombie, dlatego zapytałem tutaj, to nie jest częsty problem imo. Sprawdziłem kilka odpowiedzi, z których wszystkie mówią o zabiciu rodzica, co w moim przypadku jest inicjacją lub restartem.
Sam Stoelinga

1
„Zabij rodzica” to sposób na czerpanie korzyści ze zwykłego zombie. Nie możesz zabijać init. Jeśli zombie rodzi się ponownie init, nie możesz go zabić.
tripleee
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.