Foros del Web » Programando para Internet » Python »

kill() no mata el proceso

Estas en el tema de kill() no mata el proceso en el foro de Python en Foros del Web. Hola a tod@s, soy nuevo por aquí y no se si el tema estará bien abierto ni si sabre explicar bien el problema, pero vamos ...
  #1 (permalink)  
Antiguo 14/11/2012, 05:37
 
Fecha de Ingreso: noviembre-2012
Ubicación: Sevilla
Mensajes: 8
Antigüedad: 11 años, 5 meses
Puntos: 0
kill() no mata el proceso

Hola a tod@s, soy nuevo por aquí y no se si el tema estará bien abierto ni si sabre explicar bien el problema, pero vamos a ello.

La cosa es que tengo que hacer que python me inicie una tarea y que esta siga funcionando hasta que, en otra parte del programa decida terminarla. Básicamente es hacer una captura de trafico con tcpdump hasta que yo decida.

Lo que hago es guardar el subprocess.Popen en una variable global y después matarla.

El comando que paso es:
comando = 'tcpdump -i eth0 -w /.../%s.pcap &' %(nombre)

Después de llamar a la función correspondiente hago el subprocess
CAPTURA = subprocess.Popen(comando, stdout=sp.PIPE, stderr=sp.PIPE, shell=True)

Y más tarde llamo a otra función en donde tengo el proceso kill
CAPTURA.kill()

Espero que esté más o menos claro y podáis ayudarme, si necesitáis más info avisad.

Saludos y gracias
  #2 (permalink)  
Antiguo 14/11/2012, 11:25
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: kill() no mata el proceso

Probablemente es por que nunca sales de CAPTURA.stdout.read().
  #3 (permalink)  
Antiguo 14/11/2012, 13:56
 
Fecha de Ingreso: noviembre-2012
Ubicación: Sevilla
Mensajes: 8
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: kill() no mata el proceso

Cita:
Iniciado por razpeitia Ver Mensaje
Probablemente es por que nunca sales de CAPTURA.stdout.read().
La verdad es que no sé a qué te refieres, aunque realmente no utiliza para nada el stdout, ya que no espero que el comando me devuelva nada.

Yo creo que el problema está en la variable global, ya que poniendo el popen y el kill seguidos sí que mata al proceso
  #4 (permalink)  
Antiguo 14/11/2012, 14:45
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: kill() no mata el proceso

Sin saber que es lo que haces entre el Popen y el kill difícilmente te podemos ayudar.
  #5 (permalink)  
Antiguo 15/11/2012, 03:39
 
Fecha de Ingreso: noviembre-2012
Ubicación: Sevilla
Mensajes: 8
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: kill() no mata el proceso

A ver, me explicaré bien. Tengo montado un servidor web, que se comunica con varios pcs de una red mediante mensajes xmlrpc, estos mensajes los recibe un pc que interpreta estas ordenes con python, hace la tarea que se manda y devuelve el resultado al servidor web. Con ordenes en las que no hay que dejar un proceso abierto funciona muy bien, pero cuando tengo que dejar un proceso abierto, como es el caso de la captura, es cuando falla, porque el servidor tiene que recibir la respuesta para seguir funcionando.
En estos casos hago el popen y después mando al servidor web un mensaje diciendo que la tarea se ha iniciado, para desbloquearlo. El problema viene a la hora de cerrar el proceso al cabo de un tiempo.

Las peticiones del servidor web se reciben aquí, también se mandan las respuestas
Código PHP:
    def captura(selfaccionusuario):
    
"""
        Hace una captura de trafico
        self es la parámetro de la orden
        """
    
    
if accion == 'Iniciar':    
        
nombre str(usuario)
        
comando 'tcpdump -i eth0 -w /.../%s.txt &' %(nombre)
        
salidasalidaerr commonfunc.captura(comando)
        return 
salidasalidaerr
    
else:
        
salidasalidaerrficheroxml commonfunc.captura2(usuario)
        return 
salidasalidaerrficheroxml 
Las funciones (commonfunc) son estas
Código PHP:
def captura(comando):
    
#CAPTURA está inicializado a cero
    
global CAPTURA

    salida 
= []
    
salidaerr = []

    try:
    if 
CAPTURA == 0:
        
sp subprocess
                
        CAPTURA 
subprocess.Popen(comandostdout=sp.PIPEstderr=sp.PIPEshell=True)

        
resultado str('Captura Iniciada')
    else:
        
resultado str('Hay una captura iniciada')
    
    
salida.append(resultado)
    
            
    
except Exceptionwhy:
            
salidaerr = [str(Exception), str(why)]
    
    return 
salidasalidaerr

def captura2
(nombre):
   
    global 
CAPTURA
    salida 
= []
    
salidaerr = [] 
    
ficheroxml = []

    try:
    if 
CAPTURA != 0:
        
CAPTURA.kill()
        
CAPTURA 0
        nombre 
str(nombre)
                
#codificar el fichero de la captura para mandarlo con xmlrpc
        
fichero '/.../%s.txt' %(nombre)
        
fich open(fichero,'r')
        
ficheroxml.append(base64.b64encode(fich.read()))
        
fich.close()
        
resultado str('Captura Finalizada')
    else:
        
resultado str('No hay captura iniciada')

    
salida.append(resultado)
    
            
    
except Exceptionwhy:
            
salidaerr = [str(Exception), str(why)]
 
    return 
salidasalidaerrficheroxml 
Espero que así quede más claro y podáis ayudarme.
Saludos y gracias

Etiquetas: kill, proceso, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:50.