obtener posicion en un file descriptor??

Daniel Serpell dserpell en gmail.com
Sab Ene 31 17:53:03 CLST 2009


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)".)

    Daniel.


Más información sobre la lista de distribución Linux