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