Lỗi với lệnh iotop trên CentOS


14

Khi sử dụng sudo iotop(phiên bản mới nhất 0.6-2.el7) trong một thiết bị đầu cuối trong CentOS 7.5 mới cài đặt của tôi, tôi nhận được thông báo lỗi sau:

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

Bất kỳ ý tưởng làm thế nào để khắc phục vấn đề này?


Nó làm việc cho tôi. uname: Linux 4.4.0-127-generic # 153 ~ 14.04.1-Ubuntu phiên bản iotop: iotop 0.6 Phiên bản Phyton /usr/bin/python2.7
Marko

Câu trả lời:


31

Rõ ràng, các phiên bản kernel gần đây đã giới thiệu một dòng trống trong /proc/(pid)/statusđó iotop không mong đợi:

CapBnd: 0000001fffffffff
CapAmb: 0000000000000000
Seccomp:    0

SpeculationStoreBypass: vulnerable

Là một xấp xỉ zeroth của một sửa chữa, chỉnh sửa (như 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

nơi if not line.strip(): continuemới là Coi chừng trăn không có niềng răng rõ ràng, vì vậy vết lõm của dòng này phải khớp với dòng bên dưới nó.

(Cũng xem https://bugs.launchpad.net/pkg-website/+orms/1773383 để biết các bản sửa lỗi khác cho lỗi này.)


1
Đây là đường dẫn đến lỗi CentOS bao gồm vấn đề này: bug.centos.org/view.php?id=14864
doshea

Tương tự cho gói Python "Pympler". Dòng 147. Thêm if not entry.strip(): continuetrước để giải quyết vấn đề đó. pythonhosted.org/Pympler
Eduardo Lucio

2

Chỉ để bổ sung cho câu trả lời được chấp nhận (không thể thêm dưới dạng nhận xét vì chúng không cho phép nhiều khoảng trắng)

  1. Tìm kiếm filepath của tập lệnh Python
sudo find ./usr/lib | grep iotop/data.py
  1. Thay thế bằng sed
sed -i '1n;/key, value = line/i\            if not line.strip(): continue' <script_path>

Hãy cẩn thận và kiểm tra mọi thứ đều ổn ngay lần đầu tiên bạn chạy nó.

Đối với hệ thống của tôi, đó là:

sudo sed -i '1n;/key, value = line/i\            if not line.strip(): continue' /usr/lib/python2.7/dist-packages/iotop/data.py
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.