Conky мой простейший виджет мониторинга сети

Что требуется: показать какая программа сколько кушать просит.
Насчет "какая программа" --- [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

Lua tri bar script