Mała łata na pythonowski skrypt iotop pozwala na przełączanie sortowania nie tylko strzałkami na klawiaturze, ale bezpośrednio jednym z klawiszy liczbowych (czy akurat one są najodpowiedniejsze do tego, to rzecz do dyskusji), zależnie od kolumny. Dodaje też opcję -s z argumentem wybierającym kolumnę sortowania na starcie i -r odwracającą domyślne sortowanie w wybranej kolumnie (nazwy kolumn też do dyskusji).
Kto nie zna jeszcze tego narzędzia, podpowiadam że służy ono do podglądu, który proces lub wątek najbardziej obciąża podsystem wejścia-wyjścia. Czasem tradycyjny top pokazuje małe obciążenie CPU, a dużą wartość %wa (iowait), a zarazem często słychać wtedy pracę dysku. Dopóki top nie zostanie wyposażony w sortowanie według obciążeń 'we/wy', iotop wydaje się na takie okazje niezastąpiony.
--- iotop-0.4/iotop/ui.py 2010-03-11 03:55:19.198571041 +0100
+++ iotop-0.4-new/iotop/ui.py 2010-03-12 02:54:41.126435412 +0100
@@ -96,8 +96,9 @@
def __init__(self, win, process_list, options):
self.process_list = process_list
self.options = options
- self.sorting_key = 6
- self.sorting_reverse = IOTopUI.sorting_keys[self.sorting_key][1]
+ self.sorting_key = sorting_key_number
+ #self.sorting_reverse = IOTopUI.sorting_keys[self.sorting_key][1]
+ self.sorting_reverse = (not IOTopUI.sorting_keys[self.sorting_key][1]) if options.reverse else IOTopUI.sorting_keys[self.sorting_key][1]
if not self.options.batch:
self.win = win
self.resize()
@@ -154,6 +155,12 @@
self.sorting_key = min(len(IOTopUI.sorting_keys) - 1, self.sorting_key)
if orig_sorting_key != self.sorting_key:
self.sorting_reverse = IOTopUI.sorting_keys[self.sorting_key][1]
+
+ def set_sorting_key(self, new_sorting_key):
+ orig_sorting_key = self.sorting_key
+ self.sorting_key = new_sorting_key
+ if orig_sorting_key == self.sorting_key:
+ self.reverse_sorting()
# I wonder if switching to urwid for the display would be better here
@@ -329,6 +336,22 @@
ionice,
ord('I'):
ionice,
+ ord('0'):
+ lambda: self.set_sorting_key(0),
+ ord('1'):
+ lambda: self.set_sorting_key(1),
+ ord('2'):
+ lambda: self.set_sorting_key(2),
+ ord('3'):
+ lambda: self.set_sorting_key(3),
+ ord('4'):
+ lambda: self.set_sorting_key(4),
+ ord('5'):
+ lambda: self.set_sorting_key(5),
+ ord('6'):
+ lambda: self.set_sorting_key(6),
+ ord('7'):
+ lambda: self.set_sorting_key(7),
curses.KEY_LEFT:
lambda: self.adjust_sorting_key(-1),
curses.KEY_RIGHT:
@@ -526,6 +549,8 @@
help='suppress some lines of header (implies --batch)')
parser.add_option('--profile', action='store_true', dest='profile',
default=False, help=optparse.SUPPRESS_HELP)
+ parser.add_option("-s", "--sort", action="store", type="choice", metavar="KEY", dest="sortkey", choices=[ 'pid', 'ioprio', 'user', 'read', 'write', 'swapin', 'io', 'cmd' ], default='io', help="select sorting key, default: %default" )
+ parser.add_option("-r", "--reverse", action='store_true', help="reverse sort order")
options, args = parser.parse_args()
if args:
@@ -533,6 +558,8 @@
find_uids(options)
options.pids = options.pids or []
options.batch = options.batch or options.time or options.quiet
+ global sorting_key_number
+ sorting_key_number = parser.get_option('-s').choices.index(options.sortkey)
main_loop = lambda: run_iotop(options)
Pythona znam słabiutko, więc łata jest pewnie daleka od ideału pisania kodu. Może jednak komuś się przyda lub ktoś z Was wytknie mi błędy. Podesłałem ją też twórcy - może zechce te wypociny przejrzeć i dokleić.
Jeszcze na wypadek słówko o użyciu łaty: wklejamy ją do nowego pliku, np. iotop-sort.patch, pobieramy źródła ze strony projektu , wchodzimy do ich rozpakowanego katalogu i klepiemy patch -p1 /ścieżka/do/iotop-sort.patch . Ponieważ to skrypt, możemy go uruchomić bezpośrednio z tego katalogu, np. ./iotop.py -s read -r i używać niezależnie od oryginalnej wersji.
Jeszcze jedno: listę kluczy sortowania można bez zaglądania w łatę wywołać, zadając błędny klucz sortowania. To warto by uzupełnić, ale wolałbym żeby zamiast wpisywać na sztywno w helpa , dało się listę generować dla opcji -h wprost z oryginalnej listy możliwych kluczy.