Error con el comando iotop en CentOS


14

Cuando uso sudo iotop(última versión 0.6-2.el7) en una terminal en mi CentOS 7.5 recién instalado, recibo el siguiente mensaje de error:

Traceback (most recent call last):
  File "/sbin/iotop", line 17, in <module>
    main()
  File "/usr/lib/python2.7/site-packages/iotop/ui.py", line 620, in main
    main_loop()
  File "/usr/lib/python2.7/site-packages/iotop/ui.py", line 610, in <lambda>
    main_loop = lambda: run_iotop(options)
  File "/usr/lib/python2.7/site-packages/iotop/ui.py", line 508, in run_iotop
    return curses.wrapper(run_iotop_window, options)
  File "/usr/lib64/python2.7/curses/wrapper.py", line 43, in wrapper
    return func(stdscr, *args, **kwds)
  File "/usr/lib/python2.7/site-packages/iotop/ui.py", line 501, in run_iotop_window
    ui.run()
  File "/usr/lib/python2.7/site-packages/iotop/ui.py", line 155, in run
    self.process_list.duration)
  File "/usr/lib/python2.7/site-packages/iotop/ui.py", line 434, in refresh_display
    lines = self.get_data()
  File "/usr/lib/python2.7/site-packages/iotop/ui.py", line 415, in get_data
    return list(map(format, processes))
  File "/usr/lib/python2.7/site-packages/iotop/ui.py", line 388, in format
    cmdline = p.get_cmdline()
  File "/usr/lib/python2.7/site-packages/iotop/data.py", line 292, in get_cmdline
    proc_status = parse_proc_pid_status(self.pid)
  File "/usr/lib/python2.7/site-packages/iotop/data.py", line 196, in parse_proc_pid_status
    key, value = line.split(':\t', 1)
ValueError: need more than 1 value to unpack

¿Alguna idea para solucionar este problema?


Esto funciona para mi. uname: Linux 4.4.0-127-generic # 153 ~ 14.04.1-Ubuntu versión iotop: iotop 0.6 Versión Phyton /usr/bin/python2.7
Marko

Respuestas:


32

Aparentemente, las versiones recientes del kernel introdujeron una línea en blanco en la /proc/(pid)/statusque iotop no espera:

CapBnd: 0000001fffffffff
CapAmb: 0000000000000000
Seccomp:    0

SpeculationStoreBypass: vulnerable

Como una aproximación cero de un arreglo, edite (como root) /usr/lib/python2.7/site-packages/iotop/data.pyca l.195:

def parse_proc_pid_status(pid):
    result_dict = {}
    try:
        for line in open('/proc/%d/status' % pid):
            if not line.strip(): continue
            key, value = line.split(':\t', 1)
            result_dict[key] = value.strip()
    except IOError:
        pass  # No such process

    return result_dict

donde el if not line.strip(): continuees nuevo Tenga en cuenta que python no tiene llaves explícitas, por lo que la sangría de esta línea debe coincidir con la de la línea debajo de ella.

(Consulte también https://bugs.launchpad.net/pkg-website/+bug/1773383 para obtener otras soluciones para este error).


1
Aquí hay un enlace al error de CentOS que cubre este problema: bugs.centos.org/view.php?id=14864
doshea

Lo mismo para el paquete Python "Pympler". Línea 147. Agregue if not entry.strip(): continueantes para resolver ese problema. pythonhosted.org/Pympler
Eduardo Lucio

2

Solo para complementar la respuesta aceptada (no se pudo agregar como comentario porque no permiten múltiples espacios en blanco)

  1. Busque la ruta del archivo del script Python
sudo find ./usr/lib | grep iotop/data.py
  1. Reemplazar con sed
sed -i '1n;/key, value = line/i\            if not line.strip(): continue' <script_path>

Tenga cuidado y verifique que todo esté bien la primera vez que lo ejecute.

Para mis sistemas, es:

sudo sed -i '1n;/key, value = line/i\            if not line.strip(): continue' /usr/lib/python2.7/dist-packages/iotop/data.py
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.