obtener posicion en un file descriptor??
Rodrigo Ahumada
rodahummont en gmail.com
Sab Ene 31 19:26:51 CLST 2009
Daniel Serpell escribió:
> Hola!
>
> El Fri, Jan 30, 2009 at 02:42:00AM -0300, Aldrin Martoq escribio:
>> Estimados:
>>
>> Tengo un proceso laaaaaargo que esta leyendo un archivo. Me gustaria
>> saber en que parte de ese archivo va, para asi tener una idea de cuando
>> terminara.
>>
>> Algun hint?
>>
>> Ejemplo:
>> $ cat /dev/sda > /dev/null
>>
>> Y me gustaria saber en que posicion va del archivo /dev/sda _sin
>> modificar el codigo fuente de cat_. Algo como un ftell() pero de otro
>> proceso.
>
> Probablemente se puede, pero no de manera facil. Se me ocurre utilizar gdb
> y llamar a lseek64 desde ahí.
>
> Probemos:
>
> ----------------------
>
> # Creemos un proceso que lentamente genere caracteres y los pase
> # a "cat", redireccionando luego a /dev/null.
>
> $ while sleep 0.1; do echo -n "."; done | cat /dev/stdin > miArchivo.txt &
>
> # Ahora, encontremos el PID del proceso
> $ pgrep cat
> 10132
>
> # Conectemonos con GDB al proceso y llamamos a lseek64
> # con fd=STDOUT, offset=0 y whence = SEEK_CUR.
> $ gdb -p 10132
> GNU gdb 6.8-debian
> Copyright (C) 2008 Free Software Foundation, Inc.
> [...]
> (gdb) print (long long)lseek64((int)1,(long long)0,(int)1)
> $1 = 140
> (gdb) quit
>
> -----------------------
>
> Si, parece posible :-), pero no se si realmente sea no invasivo. Además,
> en Linux lseek* no funcionan en un pipe (retornan -1 y errno en ESPIPE),
> por lo que no sirve si estas en medio camino de un pipe.
>
> Lo que yo hago normalmente es utilizar 'dd' en medio, de la siguiente
> manera:
>
> cat /mi/archivo/grande | dd | algoQueHacer
>
> Luego, le puedes mandar una señal SIGUSR1 al dd para que muestre el estado
> de la copia (por ejemplo, con "kill -USR1 $(pgrep dd)".)
No se si será posible: si el programa que se quiere monitorear usa
fwrite o write para escribir, se tiene el código fuente como para estar
seguro de eso, se podría hacer una .so con la función fwrite o write
reescrita para que tire cada cierto avance, la posicion en el archivo, a
un archivo en /tmp..., y luego lanzar el programa haciendo que cargue el
.so antes que las libc....
Más información sobre la lista de distribución Linux