Zombie w bash

11

Bash nie wydaje się tworzyć zombie. Wygląda na to, że procesy zostają natychmiast wykorzystane, gdy zostaną zabite.

Czy mogę sprawić, by bash robił zombie?


Dlaczego pytam:

Chciałbym móc bezpiecznie zabić proces potomny lub bezpiecznie kill -9, jeśli nie umrze w pewnym okresie czasu, ale nie chcę przypadkowo zablokować procesu, który nie jest moim procesem potomnym. Procesy zombie zwykle sprawiają, że jest to bardzo łatwe i bezpieczne dla rasy.

PSkocik
źródło
1
Może inny pomysł ... jeśli naprawdę chcesz uchronić się przed zabijaniem procesów zewnętrznych, sprawdź cgroups. Wywołanie w unsharecelu utworzenia przestrzeni nazw PID, aby procesy wewnątrz tego drzewa procesów były izolowane i niedostępne.
orion
Użyj kontroli zadań (jak w, kill -KILL %ngdzie njest numer zadania itd.), Zamiast próbować go obejść.
Nominal Animal
Świetne pytanie! Alternatywne podejście do „dlaczego pytasz”: czy rozważałeś timeoutpolecenie?
Wildcard

Odpowiedzi:

13

Aby wykonać proces zombie:

$ (sleep 1 & exec /bin/sleep 10)

To zastąpi powłokę, która działa sleep 1z /bin/sleep 10tym, że nie będzie wiedział, że sleep 1proces się zakończył, więc tworzenie zombie na 10 sekund.


Nie jestem pewien, czego oczekujesz od zabicia procesu zombie. Proces zombie był już martwy, nie można go zabić.

W rzeczywistości możesz sprawić, że procesy zombie znikną, ale zabijając ich rodzica, a nie same procesy zombie.

Cuonglm
źródło
Reape PID podlegają recyklingowi. Chodzi o to, że zombie rezerwują PID, dopóki rodzic nie uzna śmierci swojego dziecka, czekając na niego. Bez tego zabicie pid może spowodować przypadkową ofiarę.
PSkocik
1
W C możesz mieć pewność, że nie staniesz się przypadkową ofiarą, kiedy zabijesz swoje dziecko, ponieważ dopóki nie poczekasz na to dziecko, PID tego dziecka nie będzie mógł zostać poddany recyklingowi. Chciałbym mieć taką samą gwarancję w powłoce.
PSkocik
3

Niezbyt interesująca odpowiedź:

$ (A=$BASHPID && ( kill -STOP $A ))

[1]+  Stopped                 ( A=$BASHPID && ( kill -STOP $A ) )

$ ps -C bash
  PID TTY          TIME CMD
29453 pts/0    00:00:00 bash
29593 pts/0    00:00:00 bash
29594 pts/0    00:00:00 bash <defunct>
yaegashi
źródło
Jak to jest proces zombie? Po prostu przestało. Również $BASHPIDto $$myślę.
Gabor Csardi
$BASHPID to nie to samo $$. Spróbuj następującego kodu: echo $$ $BASHPID ;echo $(echo $$ $BASHPID). Możesz znaleźć więcej informacji w man bash.
Alex Baranowski