Uccidi un processo che continua a riavviare


16

Cosa succede se 'kill -9' non funziona? o Come uccidere uno script che avvia nuovi processi? non mi aiuta comunque.

Ho uno script python che si avvia automaticamente con un altro processo id utilizzando la stessa porta quando viene ucciso utilizzando 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)

Non è un processo di zombi.

$ 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

Ho anche provato sudo pkill -f <processname>senza fortuna. Non vuole morire.

Aggiornare:

Il suo processo padre è il shcui genitore è sudocome menzionato nella tabella sopra. Non sono sicuro che sia sicuro ucciderli all'improvviso. Anche questo è un server Ubuntu condiviso.


Sembra che stia morendo bene. L' lsofoutput mostra un nuovo pid ogni volta. Il processo si sta semplicemente riavviando.
Patrick,

Sì, non vuole morire per sempre. Si sveglia come se non fosse mai morto :(
Lakshminarayanan Guptha,

Risposte:


26

L'avvio automatico con un altro ID processo indica che si tratta di un processo diverso. Quindi c'è un processo genitore, che controlla i suoi figli, e se uno muore, viene rigenerato dal genitore. Se desideri interrompere completamente il servizio, scopri come interrompere il processo padre. Ucciderlo SIGKILLè ovviamente una delle opzioni, ma probabilmente non The Right One TM , dal momento che il monitor di servizio potrebbe dover eseguire alcune operazioni di pulizia per arrestare correttamente.

Per trovare il processo di monitoraggio, potrebbe essere necessario ispezionare l'intero elenco dei processi, poiché gli ascoltatori effettivi potrebbero dissociarsi dai loro genitori (di solito dalla fork() + setsid()combo). In questo caso, trovo l'output di ps faux( procpsalmeno, potrebbe variare per altre implementazioni) piuttosto utile: elenca tutti i processi in un albero gerarchico. A meno che non ci sia stato un avvolgimento PID (vedi anche wikipedia ), il PID del monitor dovrebbe essere più piccolo del PID di tutti gli ascoltatori (a meno che, naturalmente, non si colpisca un avvolgimento PID).


Il suo genitore è il shcui genitore è sudo. Va bene ucciderli?
Lakshminarayanan Guptha,

Genitore di quale processo? Quello in ascolto sulla porta 3002? In quel caso elenca tutti i processi e indovina quale è il monitor. Con Linux procps, di solito trovo che l'output di ps -fauxsia abbastanza informativo. Si noti inoltre che il PID del monitor dovrebbe essere inferiore al PID dell'ascoltatore effettivo (a meno che non si abbia il sistema attivo da tempo e che i PID siano già terminati dall'avvio del servizio, ovviamente).
peterph,

Grande. ps -fauxaiutato a iniziare a uccidere dal genitore. Puoi aggiornare la tua risposta con la soluzione del commento?
Lakshminarayanan Guptha,

Sì, ci stavo pensando ... :)
peterph

ps fauxaiutato a rilevare supervisordquale riavviamento infinito impiccato dal demone della coda
Laravel

4

Se conosci la porta di ascolto del processo, puoi usare fusercon -kflag.

Qualcosa di simile a,

fuser -k 3002/tcp
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.