Вы замечали, как много всевозможных утилит по анализу производительности Linux? На них можно бесконечно писать обзоры. Клонов top море, как и анализаторов сетевой активности, каких-то ещё метрик. Я постоянно вижу подобные утилиты. Уже перестал смотреть на них, потому что объективно они не особо нужны, а для авторов это просто хобби. Если и обращаю внимание, то на что-то действительно полезное с необычным функционалом.
Я раньше думал, что это прям какие-то матёрые линуксоиды-программисты пишут подобный софт. Но на самом деле нет. Само ядро Linux в очень доступном формате отдаёт всю информацию. Достаточно её взять и красиво оформить. Покажу на простом примере.
Я постоянно использую в повседневной деятельности утилиту netstat для просмотра списка открытых портов. Если сервер сам настраиваю, то ставлю пакет с ней, если нет, то использую встроенный ss, который сейчас есть во всех дистрибутивах. Мне просто больше нравится вывод netstat, чем ss. Можете сами сравнить:
# netstat -tulnp# ss -tulnp
У ss вывод шире, поэтому часто переезжает на новую строку и получается каша. Но это не важно, написать хотел не об этом.
Представьте ситуацию, что вы в Docker контейнере, где нет этих утилит. Где вообще почти ничего нет, что встречается довольно часто, а хочется посмотреть, какие порты открыты и какие соединения установлены? Посмотреть очень просто:
# cat /proc/net/tcpВот описание того, что вы увидите.
Вы получите практически всю ту же информацию, что показывают утилиты выше, только в шестнадцатеричном формате, если речь идёт о номере порта. Достаточно его перевести в десятичный и получить нужные данные. Понятно, что для этого тоже может не быть инструментов внутри контейнера, хотя тот же bash умеет это делать. Смотрим столбец local_address, первое число - ip адрес, второе - порт. Переводим порт, например 006E, в десятичный формат:
# echo $((16#006E))110
Получаем 110 tcp порт, который открыл dovecot. Можно автоматом всё это конвертнуть:
# grep -v "local_address" /proc/net/tcp \| awk '{print $2}' | cut -d : -f 2 \| xargs -I % /bin/bash -c 'echo $((16#%))'
Сделать преобразование не трудно, если действительно необходимо. Я покажу готовый пример, который можно скопировать и где-то на тесте посмотреть результат. Вот эта команда с awk, которая переводит шестадцатиричный формат адресов и портов в десятичный.
awk 'function hextodec(str,ret,n,i,k,c){ ret = 0 n = length(str) for (i = 1; i <= n; i++) { c = tolower(substr(str, i, 1)) k = index("123456789abcdef", c) ret = ret * 16 + k } return ret}function getIP(str,ret){ ret=hextodec(substr(str,index(str,":")-2,2)); for (i=5; i>0; i-=2) { ret = ret"."hextodec(substr(str,i,2)) } ret = ret":"hextodec(substr(str,index(str,":")+1,4)) return ret} NR > 1 {{if(NR==2)print "Local - Remote";local=getIP($2);remote=getIP($3)}{print local" - "remote}}' /proc/net/tcp
Этот пример можно развить и дальше, добавив информацию из остальных столбцов о состоянии соединения, inode процесса, его породившего и всего остального. Сразу скажу, что я не разбирался, что здесь происходит 🤡. Это же bash, ему даже обфускация не нужна. Просто увидел когда-то и сохранил. Как раз тогда, когда надо было в контейнере посмотреть порты и соединения.
И такая история со всеми метриками. Их все можно взять в /proc и анализировать. Так что можете начинать изучать какой-то язык программирования и писать свой собственный top. Можно даже на bash. Правда такой пример уже есть - bashtop. Придётся придумать что-то новое 😀.
#bash