Mata un proceso que sigue reiniciando

16

¿Qué pasa si 'kill -9' no funciona? o ¿Cómo matar un script que inicia nuevos procesos? no me ayuda de ninguna manera.

Tengo un script de Python que comienza automáticamente con otra identificación de proceso que usa el mismo puerto cuando se mata usando 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)

No es un proceso 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

Incluso lo he intentado sudo pkill -f <processname>sin suerte. No quiere morir.

Actualizar:

Su proceso padre es shcuyo padre es sudocomo se menciona en la tabla anterior. No estoy seguro de si es seguro matarlos abruptamente. Además, este es un servidor ubuntu compartido.

Lakshminarayanan Guptha
fuente
Parece que está muriendo muy bien. Su lsofsalida muestra un nuevo pid cada vez. El proceso simplemente se está reiniciando.
Patrick
Sí, no quiere morir para siempre. Se despierta como si nunca hubiera muerto :(
Lakshminarayanan Guptha

Respuestas:

26

Se inicia automáticamente con otra ID de proceso, lo que significa que es un proceso diferente. Por lo tanto, hay un proceso padre, que monitorea a sus hijos, y si uno muere, el padre lo reaparece. Si desea detener el servicio por completo, descubra cómo detener el proceso principal. Matarlo SIGKILLes, por supuesto, una de las opciones, pero probablemente no sea The Right One TM , ya que el monitor de servicio podría necesitar una limpieza para apagarse correctamente.

Para encontrar el proceso de supervisión, es posible que deba inspeccionar toda la lista de procesos, ya que los oyentes reales pueden disociarse de sus padres (generalmente por el fork() + setsid()combo). En este caso, encuentro que la salida de ps faux( procpsal menos, puede variar para otras implementaciones) bastante útil: enumera todos los procesos en un árbol jerárquico. A menos que haya habido un ajuste de PID (consulte también wikipedia ), el PID del monitor debe ser más pequeño que el PID de cualquiera de los oyentes (a menos que, por supuesto, golpee un envolvente de PID).

Peterph
fuente
Su padre es de shquién es padre sudo. ¿Está bien matarlos?
Lakshminarayanan Guptha
¿Padre de qué proceso? ¿El que escucha en el puerto 3002? En ese caso, enumere todos los procesos y adivine cuál es el monitor. Con Linux procps, generalmente encuentro que la salida de ps -fauxes suficientemente informativa. También tenga en cuenta que el PID del monitor debe ser más pequeño que el PID del oyente real (a menos que tenga el sistema activo durante algún tiempo y los PID ya estén envueltos desde que se inició el servicio, por supuesto).
Peter
Excelente. ps -fauxayudó a comenzar a matar de los padres. ¿Puedes actualizar tu respuesta con la solución del comentario?
Lakshminarayanan Guptha
Sí, estaba pensando en eso ... :)
Peter
ps fauxayudó a detectar supervisordque reinició sin cesar ahorcado Laravel queue daemon
antongorodezkiy
4

Si conoce el puerto de escucha del proceso, puede usarlo fusercon -kflag.

Algo como,

fuser -k 3002/tcp
Ramesh
fuente