Ver Mensaje Individual
  #5 (permalink)  
Antiguo 15/11/2012, 03:39
BeTiLl0
 
Fecha de Ingreso: noviembre-2012
Ubicación: Sevilla
Mensajes: 8
Antigüedad: 11 años, 6 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