Приходилось ли вам отслеживать зависимости системных процессов, «кто чей папка», найти императора и убить его, чтобы рабы не респаунились? Можно ps'ать и grep'ать, можно lsof погонять, ведь это так увлекательно ;) Но любые связи, как мне кажется, всегда проще анализировать в визуальной форме, консольные утилиты рисуют хорошие таблички, но из них не всегда можно быстро понять, что с чем связано и в какой последовательности, а для диагностики это очень важно.
lsof (сокр. LiSt Open Files) при определенной сноровке позволяет строить графы взаимосвязей между запущенными системами, кто какие файлы использует, кто с кем по каким протоколом общается. На хабре уже была статья про то, какой полезный инструмент lsof, но в ней не было ничего сказано про ключ -F, который позволяет выводить информацию не в виде таблицы, а в виде последовательности отдельных строк, которые можно перенаправить на вход другой программы для дальнейшей обработки.
lsofgraph был написан, как раз под этот -F, парсить такой вывод гораздо удобнее чем табличный вывод. К сожалению, lsofgraph был написан на Lua, а она не везде стоит, так что был переписан на python: lsofgraph-python
Формат простой, а код достаточно понятный, так что не будем на этом останавливаться, а пустимся сразу в бой. Для рисования будем использовать graphviz, а именно, входящие в его состав, dot и unflatten.
Если хотите получить полную картину по системе, то надо будет использовать sudo, если же достаточно информации по текущему аккаунту, то можно и без sudo обойтись.
Чтобы создать граф:
sudo lsof -n -F | python lsofgraph.py | dot -Tjpg > /tmp/a.jpg
Мне больше нравится запуск c unflatten, тогда график как-то более компактно и красиво выглядит:
sudo lsof -n -F | python lsofgraph.py | unflatten -l 1 -c 6 | dot -T jpg > /tmp/a.jpg
Если не нравится jpg, то там можно и svg выбрать...
Пример графика, на достаточно пустой тестовой виртуалке:
Надеюсь, что кому-нибудь это все-таки будет полезно ;)
Комментарии (18)
clickfreak
12.04.2018 00:05+1Мне в качестве конечного формата больше
svg
нравится (dot -T svg > a.svg
), его можно в браузере открыть, помасштабировать и, самое главное, текст копипастить.Self_Perfection
12.04.2018 00:15+1Не говоря уж о том, что для таких графиков -Tsvg даже в несжатом виде в разы меньше чем jpg или png результат. Вообще сам зашёл оставить комментарий про svg, но вы опередили.
CKA304HUK
12.04.2018 00:37+1Не могу не отметить pstree.
akamensky
12.04.2018 06:12Я тоже как-то сразу об этом подумал, а чтобы сделать из этого графику — направить выдачу как стандартный ввод для convert (ImageMagick).
bfuvx
12.04.2018 06:16Если нужно только отследить связи parent->child, то хватит и
ps
с флагомf (-H)
. В варианте автора еще показывается, через что общаются между собой процессы, если общаются.
junkerSchmidt
12.04.2018 06:17Попробовал оригинал. Хотел фильтровать по PID (lsof -p ) — не работает. Здесь такой же недостаток? Себе сделал алиас сразу на feh (а не в файл) — слишком много процессов.
akme Автор
12.04.2018 06:30lsof -p жестко фильтрует по PID, кроме указанного PID в выводе нет других процессов, соответсвенно на выходе только один процесс и рисуется
Crandel
12.04.2018 11:25От второго питона уже даже редхад отказался) Пришлось делать форк, чтобы не ставить 2 питон
akme Автор
12.04.2018 11:48может кто на shell перепишет))
Crandel
12.04.2018 11:50Там всего надо было принт переписать)
Sly_tom_cat
12.04.2018 13:23… Причем принт функцией второй питон тоже съест…
slee_ping
12.04.2018 20:36он съест, но не как функцией, а аргументы примет как кортеж (tuple).
ps: 2to3 помогает преобразовать 2й питон в 3йSly_tom_cat
12.04.2018 23:07А нефиг неформатированные значения выводить принтом.
А с форматом — разницы нет.
python2:
>>> print("%d:%d"%(1,2))
1:2
python3:
>>> print("%d:%d"%(1,2))
1:2
SirEdvin
Вы не поверите, но python тоже не везде стоит :(
maxzhurkin
Строго говоря, всё не везде стоит, так что имелось в виду, видимо, «Lua стоит более не везде, чем Python»
clickfreak
Тогда там и
lsof
может не быть :DПайпы в помощь:
sudo
"в лоб" не везде взлетит, конечно. В целом, сам граф можно построить где угодно если есть возможность передать выводlsof
с сервера куда-нибудь ещёakme Автор
Извините, но там и линукса может не быть…