Приходилось ли вам отслеживать зависимости системных процессов, «кто чей папка», найти императора и убить его, чтобы рабы не респаунились? Можно 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 выбрать…
Пример графика, на достаточно пустой тестовой виртуалке:
Надеюсь, что кому-нибудь это все таки будет полезно 😉