[pyar] Cómo implementar, era --> Re: tail -f con esteroides en Python para ver logs en tiempo real

Leonardo Vidarte lvidarte en gmail.com
Vie Ago 27 12:04:45 ART 2010


2010/8/27 Daniel Moisset <dmoisset en machinalis.com>:
> 2010/8/27 Roberto Alsina <ralsina en netmanagers.com.ar>:
>>>
>>> Pero se tiene que poder: si hago "ls | less", less lee de stdin y es
>>> interactivo
>>>
>>> Sin tiempo de probarlo aca, lo primero que se me ocurre es leer la
>>> entrada interactiva de /dev/tty/ (Si, unix only), y la entrada de
>>> stdin. y probablemente tengas que multiplexar con select.select, o
>>> select.poll, o algo de mas alto nivel para multiplexar estas cosas (se
>>> me ocurre glib y eventos, por ej. Calculo que twisted tambien, quizas
>>> es overkill)
>>
>> Es cuestión de "reabrir" stdin (de ahí lo de "normalmente" ;-) En C se hace
>> algo con dup o dup2 pero la verdad no me acuerdo bien.
>
> No podes reabrir stdin. dup/dup2 clonan un fd a algo que ya tenes
> abierto. pero cuando te llaman con una redireccion o pipe, lo que hace
> el shell es cerrarte el stdin (y hacer un dup para que stdin sea el
> archivo/pipe nuevo).
>
> Asi que en ese momento no tenes ninguna referencia a la tty y la unica
> forma de obtenerla de vuelta es con un open

Se puede desde otra terminal, usando el file descriptor stdin
del proceso. Hice esto:

# pipe.py
while True:
    line = raw_input()
        if line == 'hola':
            print "hola mundo"
    else:
         print line

$ tail -f /var/log/messages | ./pipe.py

Luego averigué el PID de pipe.py

$ ps -fax | grep pipe.py
19439 pts/0    S+     0:00  |   \_ python ./pipe.py

Ahora mando el comando:
echo "hola" > /proc/19439/fd/0

Por ahí es mejor solución que escribir directamente en la salida de tail
porque si estás leyendo el log *movido* como el de Apache
va a ser dificil terminar de escribir algo.

-- 
// Leo



More information about the pyar mailing list