
Как заставить инструмент iftop
печатать снимок активных подключений один раз, не переключаясь в текстовом режиме?
iftop -t -i eth2
решение1
Кажется, нет способарассказывать iftop -t
для печати одного фрагмента и без зацикливания.
Для сравнения: top -b -n 1
можете делать то, что хотите, соответствующая опция — -n 1
. Это другой инструмент, но этот пример показывает, насколько это может быть просто, когда инструмент поддерживает опцию (примечание: iftop
понимает -n
, но этодругой, несвязанный вариант).
Тем не менее, вы можете проанализировать вывод и остановиться после первого куска. В моем Debian 10 iftop -t
каждый кусок завершается строкой, состоящей из множества =
символов. Кажется, ^==
это хорошее регулярное выражение для обнаружения конца куска без ложных срабатываний.
Эта команда завершается после первого фрагмента:
iftop -t -i eth2 | sed '/^==/ q'
Альтернативно:
iftop -t -i eth2 | awk '{print; if ($0 ~ "^==") exit}'
Для выхода после N-го куска нам нужен более сложный код. В следующем примере N равно 3. Настройте n=3
под свои нужды:
iftop -t -i eth2 | awk -v n=3 '
BEGIN {if (n<=0) exit}
{
print
if ($0 ~ "^==") n--
if (n<=0) exit
}'
Примечания:
- Когда
awk
(илиsed
) завершается,iftop
не уведомляется немедленно. Он получает уведомлениеSIGPIPE
только тогда, когда пытается записать что-то еще в теперь сломанный канал. Это означает, что вся команда остановится, пока неiftop
сгенерирует еще один кусок (который не будет напечатан). Это нормально. Оптимизацияiftop
в этом вопросе не имеет особого смысла, это не похоже на то, что он будет остановливаться вечно. Сравнитькак это имеет смысл дляtail
. - Если вся команда выводится на консоль, вы можете увидеть, что вывод останавливается на середине фрагмента. Это поведение отличается от вывода из sole, где полные фрагменты появляются с паузами между ними. Виновата
iftop -t
буферизация междуiftop
и . В моих тестахawk
stdbuf -oL iftop …
помогло. iftop
выводит некоторые сообщения в stderr. Они не пройдут через конвейер, если вы не используетеiftop … 2>&1 | …
.