Как вы читаете STDOUT в переменные в bash?

Ответ fche — очень хорошая подсказка, спасибо за это, хотя на самом деле это не решает проблему, потому что вопрос заключался в том, чтобы ограничить процесс определенной пропускной способностью.

Я бы предложил что-то вроде этого:

systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb

или устаревшая версия:

systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb

Тем не менее, это не подходит к вопросу, потому что его нельзя использовать для уже запущенного процесса, но, возможно, это полезно в некоторых других случаях.

Ссылки:

6
21.07.2020, 23:21
2 ответа

Поскольку скорости сети не являются целыми числами, нам необходимо использовать другие инструменты, такие как awk, для обработки чисел. Попробуйте:

ifstat -ni wlp7s0 | awk 'NR>2{if ($1+0<100 && $2+0<100) print "Network is slow."; else print "Network is fast."}'

Или, для тех, кто любит, чтобы их команды располагались на нескольких строках:

ifstat -ni wlp7s0 | awk '
    NR>2{
        if ($1+0<100 && $2+0<100)
            print "Network is slow."
        else
            print "Network is fast."
    }'

Как это работает

Параметр -nдобавлен к ifstatдля подавления периодического повторения строк заголовка.

NR>2{...}указывает awk обрабатывать команды в фигурных скобках, только если номер строки NRбольше двух. Это приводит к пропуску строк заголовка.

if ($1+0<100 && $2+0<100)проверяет, меньше ли первое поле $и второе поле $2100. Если да, то выполняется print "Network is slow.". Если нет, то выполняется print "Network is fast.".

13
18.03.2021, 23:18

John1024 прав насчет чисел с плавающей запятой, но мы можем просто обрезать числа. С простым башом:

n=0
LC_NUMERIC=C  ifstat -i $interface  \
| while read -r in out; do
  ((++n < 2)) && continue # skip the header
  if (( ${in%.*} < 100 && ${out%.*} < 100 )); then
    echo Network is slow.
  else
    echo Network is fast.
  fi
done
13
18.03.2021, 23:18

Теги

Похожие вопросы