Zabij proces, który uruchamia się ponownie

16

Co jeśli „kill -9” nie działa? lub Jak zabić skrypt uruchamiający nowe procesy? i tak mi nie pomaga.

Mam skrypt w języku Python, który uruchamia się automatycznie z innym identyfikatorem procesu używającym tego samego portu, gdy zostanie zabity przy użyciu sudo kill -9 <pid>.

$ lsof -i :3002
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python  13242 ubuntu    3u  IPv4  64592      0t0  TCP localhost:3002 (LISTEN)
$ sudo kill -9 13242
$ lsof -i :3002
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python  16106 ubuntu    3u  IPv4  74792      0t0  TCP localhost:3002 (LISTEN)
$ sudo kill 16106
$ lsof -i :3002
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python  16294 ubuntu    3u  IPv4  75677      0t0  TCP localhost:3002 (LISTEN)

To nie jest proces Zombie.

$ ps -Al

4 S     0 16289     1  0  80   0 - 12901 poll_s ?        00:00:00 sudo
4 S  1000 16293 16289  0  80   0 -  1100 wait   ?        00:00:00 sh
0 S  1000 16294 16293  0  80   0 - 34632 poll_s ?        00:00:00 python

Próbowałem nawet sudo pkill -f <processname>bez powodzenia. Nie chce umrzeć.

Aktualizacja:

Jest to proces nadrzędny, shktórego rodzic jest taki, sudojak wspomniano w powyższej tabeli. Nie jestem pewien, czy można bezpiecznie zabić ich nagle. Jest to także wspólny serwer Ubuntu.

Lakshminarayanan Guptha
źródło
Wygląda na to, że umiera dobrze. Twój lsofwynik pokazuje nowy pid za każdym razem. Proces jest po prostu restartowany.
Patrick
Tak, nie chce umrzeć na zawsze. Budzi się, jakby nigdy nie umarł :(
Lakshminarayanan Guptha

Odpowiedzi:

26

Uruchamia się automatycznie z innym identyfikatorem procesu, co oznacza, że ​​jest to inny proces. Tak więc istnieje proces nadrzędny, który monitoruje swoje dzieci, a jeśli ktoś umrze, rodzic go odradza. Jeśli chcesz całkowicie zatrzymać usługę, dowiedz się, jak zatrzymać proces nadrzędny. Zabicie go SIGKILLto oczywiście jedna z opcji, ale prawdopodobnie nie jest to The Right One TM , ponieważ monitor usługi może wymagać wykonania czyszczenia, aby poprawnie się zamknąć.

Aby znaleźć proces monitorowania, może być konieczne sprawdzenie całej listy procesów, ponieważ faktyczni słuchacze mogą oddzielić się od swojego rodzica (zwykle przez fork() + setsid()kombinację). W tym przypadku dane wyjściowe ps faux( procpsprzynajmniej mogą się różnić w przypadku innych implementacji) są raczej przydatne - zawiera listę wszystkich procesów w drzewie hierarchicznym. O ile nie doszło do zawinięcia PID (patrz także wikipedia ), PID monitora powinien być mniejszy niż PID któregokolwiek ze słuchaczy (chyba że trafisz na PID-owinięcie).

Peter
źródło
Jego rodzicem jest shjego rodzic sudo. Czy można je zabić?
Lakshminarayanan Guptha
Rodzic którego procesu? Ten nasłuchujący na porcie 3002? W takim przypadku wypisz wszystkie procesy i zgadnij, który to monitor. W Linuksie procpszwykle uważam, że dane wyjściowe ps -fauxsą wystarczająco pouczające. Zauważ też, że PID monitora powinien być mniejszy niż PID rzeczywistego odbiornika (chyba że masz włączony system przez pewien czas, a PID są już opakowane, odkąd usługa została uruchomiona).
peterph
Świetny. ps -fauxpomógł zacząć zabijać od rodzica. Czy możesz zaktualizować swoją odpowiedź o rozwiązanie z komentarza?
Lakshminarayanan Guptha
Tak, myślałem o tym ... :)
peterph
ps fauxpomógł wykryć, supervisordktóry bez końca restartował zawieszonego demona kolejki
Laravel
4

Jeśli znasz portu nasłuchiwania procesu, można skorzystać fuserz -kflagą.

Coś jak,

fuser -k 3002/tcp
Ramesh
źródło