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