Визуализация связей процессов в Linux



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



    Надеюсь, что кому-нибудь это все-таки будет полезно ;)
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 22

      +1

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

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

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


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


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

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

            +8
            Извините, но там и линукса может не быть…
              0
              И даже при том, оно может работать, если, конечно, под линуксом вы не подразумевали в том числе всякие BSD и некоторые другие системы
          +1

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

            +2
            Не говоря уж о том, что для таких графиков -Tsvg даже в несжатом виде в разы меньше чем jpg или png результат. Вообще сам зашёл оставить комментарий про svg, но вы опередили.
              +1
              добавил в статью
            +4
            Не могу не отметить pstree.
              0
              Я тоже как-то сразу об этом подумал, а чтобы сделать из этого графику — направить выдачу как стандартный ввод для convert (ImageMagick).
                0
                Если нужно только отследить связи parent->child, то хватит и ps с флагом f (-H). В варианте автора еще показывается, через что общаются между собой процессы, если общаются.
                0
                Попробовал оригинал. Хотел фильтровать по PID (lsof -p ) — не работает. Здесь такой же недостаток? Себе сделал алиас сразу на feh (а не в файл) — слишком много процессов.
                  0
                  lsof -p жестко фильтрует по PID, кроме указанного PID в выводе нет других процессов, соответсвенно на выходе только один процесс и рисуется
                    0
                    Я не понял, как это касается зависимостей — файлов, сокетов и прочее. Они-то как раз в выводе есть, но в итоге «на картинке» только один прямоугольник с самим процессом и никаких связей. Что я упускаю?
                      0
                      Скрипт строит зависимости между «корневыми» PID, которые есть в выводе, по сути все эти зависимости являются ветками дерева, которые начинаются с PID, по этим веткам и рисуются связи между процессами, если процесс указан один, то и дерево одно получается и ему не за кого зацепиться своими ветками.
                  0

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

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

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

                        0
                        … Причем принт функцией второй питон тоже съест…
                          0
                          он съест, но не как функцией, а аргументы примет как кортеж (tuple).
                          ps: 2to3 помогает преобразовать 2й питон в 3й
                            0
                            А нефиг неформатированные значения выводить принтом.
                            А с форматом — разницы нет.
                            python2:
                            >>> print("%d:%d"%(1,2))
                            1:2
                            python3:
                            >>> print("%d:%d"%(1,2))
                            1:2
                        0
                        Разве сейчас не модно просить все предоставить в виде реализации на rust? :)

                    Only users with full accounts can post comments. Log in, please.