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


  1. SirEdvin
    11.04.2018 22:21

    Вы не поверите, но python тоже не везде стоит :(


    1. maxzhurkin
      11.04.2018 23:42
      +3

      Строго говоря, всё не везде стоит, так что имелось в виду, видимо, «Lua стоит более не везде, чем Python»


    1. clickfreak
      11.04.2018 23:48
      +1

      Тогда там и lsof может не быть :D


      Пайпы в помощь:


      ssh my-little-server '[sudo] lsof -n -F' | python lsofgraph.py | ...

      sudo "в лоб" не везде взлетит, конечно. В целом, сам граф можно построить где угодно если есть возможность передать вывод lsof с сервера куда-нибудь ещё


      1. akme Автор
        12.04.2018 00:38
        +1

        Извините, но там и линукса может не быть…


  1. clickfreak
    12.04.2018 00:05
    +1

    Мне в качестве конечного формата больше svg нравится (dot -T svg > a.svg), его можно в браузере открыть, помасштабировать и, самое главное, текст копипастить.


    1. Self_Perfection
      12.04.2018 00:15
      +1

      Не говоря уж о том, что для таких графиков -Tsvg даже в несжатом виде в разы меньше чем jpg или png результат. Вообще сам зашёл оставить комментарий про svg, но вы опередили.


      1. akme Автор
        12.04.2018 00:25
        +1

        добавил в статью


  1. CKA304HUK
    12.04.2018 00:37
    +1

    Не могу не отметить pstree.


    1. akamensky
      12.04.2018 06:12

      Я тоже как-то сразу об этом подумал, а чтобы сделать из этого графику — направить выдачу как стандартный ввод для convert (ImageMagick).


    1. bfuvx
      12.04.2018 06:16

      Если нужно только отследить связи parent->child, то хватит и ps с флагом f (-H). В варианте автора еще показывается, через что общаются между собой процессы, если общаются.


  1. junkerSchmidt
    12.04.2018 06:17

    Попробовал оригинал. Хотел фильтровать по PID (lsof -p ) — не работает. Здесь такой же недостаток? Себе сделал алиас сразу на feh (а не в файл) — слишком много процессов.


    1. akme Автор
      12.04.2018 06:30

      lsof -p жестко фильтрует по PID, кроме указанного PID в выводе нет других процессов, соответсвенно на выходе только один процесс и рисуется


  1. Crandel
    12.04.2018 11:25

    От второго питона уже даже редхад отказался) Пришлось делать форк, чтобы не ставить 2 питон


    1. akme Автор
      12.04.2018 11:48

      может кто на shell перепишет))


      1. Crandel
        12.04.2018 11:50

        Там всего надо было принт переписать)


        1. Sly_tom_cat
          12.04.2018 13:23

          … Причем принт функцией второй питон тоже съест…


          1. slee_ping
            12.04.2018 20:36

            он съест, но не как функцией, а аргументы примет как кортеж (tuple).
            ps: 2to3 помогает преобразовать 2й питон в 3й


            1. Sly_tom_cat
              12.04.2018 23:07

              А нефиг неформатированные значения выводить принтом.
              А с форматом — разницы нет.
              python2:
              >>> print("%d:%d"%(1,2))
              1:2
              python3:
              >>> print("%d:%d"%(1,2))
              1:2