Fehler mit dem Befehl iotop unter CentOS

Fehler mit dem Befehl iotop unter CentOS

Wenn ich sudo iotop(neueste Version 0.6-2.el7) in einem Terminal in meinem neu installierten CentOS 7.5 verwende, erhalte ich die folgende Fehlermeldung:

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

Irgendeine Idee, wie man dieses Problem beheben kann?

Antwort1

Offenbar wurde in den neuesten Kernel-Versionen eine Leerzeile eingeführt, /proc/(pid)/statusdie iotop nicht erwartet:

CapBnd: 0000001fffffffff
CapAmb: 0000000000000000
Seccomp:    0

SpeculationStoreBypass: vulnerable

Als nullte Näherung einer Korrektur bearbeiten Sie (als 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

wobei „ if not line.strip(): continueneu“ ist. Beachten Sie, dass Python keine expliziten Klammern hat, daher sollte die Einrückung dieser Zeile mit der der Zeile darunter übereinstimmen.

(Siehe auchhttps://bugs.launchpad.net/pkg-website/+bug/1773383für weitere Korrekturen für diesen Fehler.)

Antwort2

Nur als Ergänzung zur akzeptierten Antwort (konnte nicht als Kommentar hinzugefügt werden, da mehrere Leerzeichen nicht zulässig sind)

  1. Suchen Sie nach dem Dateipfad des Python-Skripts
sudo find ./usr/lib | grep iotop/data.py
  1. Ersetzen durch sed
sed -i '1n;/key, value = line/i\            if not line.strip(): continue' <script_path>

Seien Sie vorsichtig und überprüfen Sie beim ersten Ausführen, ob alles in Ordnung ist.

Für meine Systeme ist es:

sudo sed -i '1n;/key, value = line/i\            if not line.strip(): continue' /usr/lib/python2.7/dist-packages/iotop/data.py

verwandte Informationen