obtener posicion en un file descriptor??

Aldrin Martoq amartoq en dcc.uchile.cl
Jue Feb 5 18:45:35 CLST 2009


2009/2/4 Daniel Serpell <dserpell en gmail.com>:
> El Tue, Feb 03, 2009 at 11:54:46PM -0300, Aldrin Martoq escribio:
>> Al final cachureando en fs/proc/* ya estaba hecho... encontre el
>> directorio /proc/<pid>/fdinfo/ que tiene exactamente lo que necesito!
>> http://aldrin.martoq.cl/techblog/2009/02/getting-current-file-position-from-a-running-process/
> ¡Fantástico! ... y cómo no lo vimos antes :-)
> Voy a guardar tu script por aquí para tenerlo presente, me ha pasado más de una vez
> necesitar esa información.
> Por lo pronto, lo modifiqué para hacerlo un poco más robusto, ve al final.

Lo de division por cero, bien! Ahora no se me ocurre cuando podria
fallar el os.stat() ...

Lo otro que seria interesante es que las columnas se autoajusten a su
tama~no (salvo "cmd" que no deberia ser mas grande que 12 digamos) ...
alguna implementacion bonita?


gracias por el aporte!

> -------------------------------------------------------------------------------
> #!/usr/bin/env python
>
> # Copyright(C) 2009 Aldrin Martoq aldrin en martoq.cl
> # Licensed under GPL v2
>
> import sys, os
>
> cols = ['pid', 'cmd', 'fd', 'pos', 'size', '%', 'path']
> p1 = '/proc/%s/fdinfo/'
> p2 = '/proc/%s/fdinfo/%s'
> p3 = '/proc/%s/fd/%s'
> p4 = '/proc/%s/cmdline'
>
> WIDTH=12
>
> for i in cols:
>  print "%-*s" % (WIDTH, i),
> print
>
> for pid in sys.argv[1:]:
>  for fd in os.listdir(p1 % pid):
>  d = dict(tuple(map(str.strip, l.split(':')))
>    for l in open(p2 % (pid, fd)))
>  d['path'] = os.readlink(p3 % (pid,fd))
>  for p in ['socket', 'pipe', '/dev', 'inotify']:
>    # skip boring fd's...
>    if d['path'].startswith("%s" % p): break
>  else:
>    d['fd'] = fd
>    d['pid'] = pid
>    d['cmd'] = '%*.*s' % (WIDTH, WIDTH,
>      open(p4 % pid).readline().strip())
>    try:
>      d['size'] = os.stat(d['path'])[6]
>    except:
>      d['size'] = 0
>    if d['size'] > 0:
>      d['%'] = '%5.1f' % (100.0 * int(d['pos']) / d['size'])
>    else:
>      d['%'] = '  -'
>    for i in cols:
>      print "%-*s" % (WIDTH, d[i]),
>    print
>



-- 
Aldrin Martoq
http://aldrin.martoq.cl/



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