Что требуется: показать какая программа сколько кушать просит.
Насчет "какая программа" --- [man:netstat] выводит на ура. А вот сколько кушать, он показывает только из очереди.
Так, например, широко известная комбинация букв netstat --tcp --numeric-hosts --program (netstat -tnp) выдает такой список
(Не все процессы были идентифицированы, информация о процессах без владельца не будет отображена, вам нужны права суперпользователя (root), чтобы увидеть всю информацию.) Активные соединения с интернетом (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 192.168.1.100:55349 188.40.74.10:www TIME_WAIT - tcp 0 0 192.168.1.100:56372 209.85.137.:xmpp-client ESTABLISHED 30518/chromium-brow tcp 83 0 192.168.1.100:48120 188.24.56.55:30153 CLOSE_WAIT 30518/chromium-brow tcp 0 0 192.168.1.100:34804 204.9.163.158:www TIME_WAIT - tcp 16 0 192.168.1.100:44375 109.160.63.18:42061 CLOSE_WAIT 30518/chromium-brow tcp 1 0 192.168.1.100:46531 188.134.68.104:4220 CLOSE_WAIT 30518/chromium-brow tcp 0 0 192.168.1.100:52628 188.25.143.114:44673 CLOSE_WAIT 30518/chromium-brow tcp 0 0 192.168.1.100:55354 188.40.74.10:www TIME_WAIT - tcp 1 0 192.168.1.100:48023 193.239.92.164:18273 CLOSE_WAIT 30518/chromium-brow tcp 1 0 192.168.1.100:48016 193.239.92.164:18273 CLOSE_WAIT 30518/chromium-brow tcp 0 0 192.168.1.100:55363 188.40.74.10:www TIME_WAIT - tcp 0 0 192.168.1.100:55350 188.40.74.10:www TIME_WAIT - tcp 0 0 192.168.1.100:55357 188.40.74.10:www TIME_WAIT - tcp 0 0 192.168.1.100:55351 188.40.74.10:www TIME_WAIT - tcp 3 0 192.168.1.100:38013 86.151.181.178:https CLOSE_WAIT 30518/chromium-brow tcp 16 0 192.168.1.100:37886 109.202.225.243:38550 CLOSE_WAIT 30518/chromium-brow tcp 1 0 192.168.1.100:46540 188.134.68.104:4220 CLOSE_WAIT 30518/chromium-brow
А уж netstat -s рай сетевика-математика
Так для меня имеют ценность только установленные (ESTABLISHED) соединения, сделаем [man:grep], а также отсечем вывод ошибок (stderr = 2)
$ netstat --tcp --numeric-hosts --program 2>/dev/null | grep ESTABLISHED tcp 0 0 192.168.1.100:38609 190.213.109.83:50868 ESTABLISHED 524/ktorrent tcp 0 0 192.168.1.100:35524 77.35.46.126:15514 ESTABLISHED 524/ktorrent tcp 0 0 192.168.1.100:38100 217.175.0.34:25584 ESTABLISHED 524/ktorrent tcp 0 0 192.168.1.100:39143 178.187.69.47:60342 ESTABLISHED 524/ktorrent tcp 0 0 192.168.1.100:60377 95.25.60.23:59039 ESTABLISHED 524/ktorrent tcp 0 0 192.168.1.100:39405 93.90.39.90:16282 ESTABLISHED 524/ktorrent tcp 0 0 192.168.1.100:34901 85.15.91.198:35691 ESTABLISHED 524/ktorrent tcp 0 0 192.168.1.100:60704 178.34.104.54:35691 ESTABLISHED 524/ktorrent tcp 0 1573 192.168.1.100:50246 89.112.30.247:50000 ESTABLISHED 524/ktorrent tcp 0 0 192.168.1.100:56372 209.85.137.:xmpp-client ESTABLISHED 30518/chromium-brow tcp 0 138 192.168.1.100:45904 87.228.60.20:14397 ESTABLISHED 524/ktorrent tcp 0 1658 192.168.1.100:58477 95.30.165.199:32655 ESTABLISHED 524/ktorrent tcp 0 0 192.168.1.100:42258 188.187.50.220:9530 ESTABLISHED 5870/skype tcp 0 0 192.168.1.100:41411 89.252.15.166:16881 ESTABLISHED 524/ktorrent tcp 0 0 192.168.1.100:33178 93.177.184.65:59039 ESTABLISHED 524/ktorrent
Оппа, а вот бывает и так. Поэтому, следует посчитать сумму байт ожидающих данных в очереди во всех соединениях каждой программы. Для этого очень удобно подойдет [man:awk]. Строка программы находится в 7 столбце вывода. Начинаем составлять заклинание для [man:awk]. Для каждой строки будем считать кол-во строк этой программы (кол-во соедининий) и сумму байт в очереди: { sum[ $7 ] += $2; count[ $7 ]++ }. Для входящей очереди нужно вместо $2 брать $3 столбец. В конце просто выведем с форматированием: END { for ( s in sum ) printf "%7d %dx %s\n", sum[ s ], count[ s ], s }. Взрываем:
$ netstat --tcp --numeric-hosts --program 2>/dev/null | grep ESTABLISHED | awk ' { sum[ $7 ] += $2; count[ $7 ]++ } END s in sum ) printf "%7d %dx %s\n", sum[ s ], count[ s ], s }'
0 10x 30518/chromium-brow
0 59x 524/ktorrentГораздо лучше, до удобоваримого вида осталось совсем чуть-чуть. В этом примере в очереди, к сожалению и к небольшому счастью, по нулям. Однако, это не значит, что отсортировать по количеству не стоит. Еще как! sort --numeric --key=1 --reverse - в этом заклинании мы говорим [man:sort], что надо сортировать числовым сравнением по числам в первой колонке и по убыванию (в обратном порядке). Ну и наконец, на любителя, от получившегося вывода можно отсечь первые 15 строк, чтобы все умещалось в конечную область экрана. Кастуем [man:head]: head --lines=15. Сводим итог:
$ netstat --tcp --numeric-hosts --program 2>/dev/null | grep ESTABLISHED | awk ' { sum[ $7 ] += $3; count[ $7 ]++ } END { for ( s in sum ) printf "%7d %dx %s\n", sum[ s ], count[ s ], s }' | sort --numeric --key=1 --reverse | head --lines=15
5483 55x 524/ktorrent
0 1x 5870/skype
0 1x 30518/chromium-browЭто меня устраивает. Осталось дело совсем за пустяком, вывести это с помощью [man:conky]. Просто приведу как это выглядит в конфиге [man:conky], а в самом низу ссылки на полные текущие версии конфига и скрипта полоски-трех-значений:
TEXT
${if_gw wlan0}${color2}${font Lucida Grande:size=12}Send-Q ${totaldown wlan0}${color} / ${upspeed wlan0}${font}
${execi 5 netstat --tcp --numeric-hosts --program 2>/dev/null | grep ESTABLISHED | awk ' { sum[ $7 ] += $3; count[ $7 ]++ } END { for ( s in sum ) printf "%7d %dx %s\n", sum[ s ], count[ s ], s }' | sort --numeric --key=1 --reverse | head --lines=15 }
${color2}${font Lucida Grande:size=12}Recv-Q ${totalup wlan0}${color} / ${downspeed wlan0}${font}
${execi 5 netstat --tcp --numeric-hosts --program 2>/dev/null | grep ESTABLISHED | awk ' { sum[ $7 ] += $2; count[ $7 ]++ } END { for ( s in sum ) printf "%7d %dx %s\n", sum[ s ], count[ s ], s }' | sort --numeric --key=1 --reverse | head --lines=15 }
${lua tribar wlan0}
${endif}
|
|
![]() |
| Альбом: Deep virtual |