obtener posicion en un file descriptor??

Daniel Serpell dserpell en gmail.com
Mie Feb 4 22:55:50 CLST 2009


Hola!

El Tue, Feb 03, 2009 at 11:54:46PM -0300, Aldrin Martoq escribio:
> On Tue, 2009-02-03 at 17:42 -0300, Aldrin Martoq wrote:
> [...]
> > Otra opcion que vi _sin modificar los programas_ seria armar un modulo
> > del kernel que ponga un archivo especial en /proc, y uno de el PID y
> > tire un mapa de los archivos. Ej:
> > # echo $PID > /proc/fdmaps
> > #fd #pos
> > 0 -1
> > 1 -1
> > 2 -1
> > 3 54534
> 
> Al final cachureando en fs/proc/* ya estaba hecho... encontre el
> directorio /proc/<pid>/fdinfo/ que tiene exactamente lo que necesito!
> 
> Un programa python para aquello aca:
> 
> 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.

    Daniel.

-------------------------------------------------------------------------------
#!/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


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