Bash: Динамическое формирование трафика rsync с использованием переменных для расписания и замедления во время выполнения?

Bash: Динамическое формирование трафика rsync с использованием переменных для расписания и замедления во время выполнения?

Каковы некоторые решения для запуска динамического формирования трафика во время выполнения bash-скрипта?после того, как команда уже началась? Возможно ли это вообще?

Мой вариант использования таков: я rsyncработаю на огромном наборе дисков в удаленном хранилище резервных копий, и это занимает много-много часов через Интернет, поэтому я хотел бы применить формирование трафика к линии, где rsyncоно вызывается, но только в определенное время.

Например, текущий график предусматривает снижение скорости загрузки до 1000 килобайт в секунду (1,0 МБ/с) в период с 5 до 10 утра и с 15 до 21 часа.

Я смотрел на --bwlimit=1000это, rsyncно это формирует rsyncвсе время, пока он работает,не только желаемые сроки формирования.

Можно ли замедлить его, rsyncкогда он уже запущен? Потому что если это возможно каким-то образом, это было бы моим решением.

Я видел, как люди предлагали это wondershaper, но мне интересно, можно ли это "включать и выключать" программно? И если да, то как это сделать?

Вот макет, который я собрал, используя щедрые пожертвования Stackoverflow, который предоставляет функционал указания и проверки расписания (на основе часа, что вполне подходит для моих нужд на данный момент)...

#!/bin/bash

declare -A shapingTimes
declare -A keycount

useTrafficShaping=1

# schedule
shapingTimes=([0-from]=5 [0-to]=10)  # 5am to 10am
shapingTimes+=([1-from]=15 [1-to]=21)  # 3pm to 9pm

# because keys and array content differs in order from the way they are defined, we need to tidy this up by setting up the shaping times order in the way in which it is defined above
# to do this, count how many keys used in array entry (https://stackoverflow.com/questions/63532910)
# we use this result to to dynamically calculate the total number of entries ($totalshapingTimes)
for i in "${!shapingTimes[@]}"; do keycount[${i//[0-9]-/}]=""; done
totalshapingTimes=$((${#shapingTimes[*]} / ${#keycount[@]}))
x=1; while [[ $x -le "$totalshapingTimes" ]]; do shapingTimes_order+="$(( x-1 )) "; x=$(( $x + 1 )); done
# 'shapingTimes_order' array is used later in this script to process which shapingTimes are handled in what order


if [[ -n $useTrafficShaping ]] && [[ $useTrafficShaping == 1 ]]; then
    echo "Traffic shaping: ON"
    # get current time (hour) to determine if we're inside peak times
    currentHour=$(date +%H)
        
        # display our traffic shaping time windows as defined in above array
        echo "Defined schedule:"
        for i in ${shapingTimes_order[*]}; do
            echo "${shapingTimes[$i-from]}hrs to ${shapingTimes[$i-to]}hrs"
            # work out which peak times we're using, thanks to the help of Glenn Jackman (https://stackoverflow.com/questions/18128573)
            if (( ${shapingTimes[$i-from]} <= 10#$currentHour && 10#$currentHour < ${shapingTimes[$i-to]} )); then
                # current time matches a specified shaping timeframe, so rsync should go SLOW!
                shape=1
            fi
        done

        echo "The current hour is $currentHour"
        if [[ -z $shape ]]; then
            echo "Not in a shaping window, rsync can run as normal."
            # some command here, run rsync as normal
        else
            echo "Matches a shaping schedule. *** SHAPING NETWORK TRAFFIC ***"
            # command here to kick in traffic shaping
        fi

else
    echo "Traffic shaping: OFF"
    # run rsync as normal
fi

решение1

rsyncне может иметь динамически измененный параметр ограничения пропускной способности.
Однако вы могли бы

  • Разделите работу на несколько более мелких задачгде каждый будет иметь определенный предел пропускной способности в зависимости от времени его начала, например

например

rsync a b c d e target:/dir/

to

rsync --bw-limit=bw1 a target:/dir/
...
rsync --bw-limit=bw2 e target:/dir/
  • Используйте --time-limit=MINSопцию

rsyncявляется умным и не будет повторять то, что только что сделал, если файлы синхронизированы, поэтому вы можете запустить его rsyncна 1 час с ограничением bw1, затем перезапустить его с bw2 и т. д. (и приостановить его, если это необходимо), или объединить с приведенным выше решением.

rsync --bw-limit=bw1 --time-limit=60 ...

rsync --bw-limit=bw2 --time-limit=60 ...
  • Изменить rsync

Если вам это нравится, rsyncэто приложение с открытым исходным кодом, и вы можете добавить код, чтобы rsyncдинамически реагировать на какой-либо сигнал (сигналиубийство), что изменит внутренние параметры (возможно, придется также изменить целевой демон rsync в зависимости от кода)

rsync --my-new-version ...

kill -SIGNALTOSLOW rsyncpid
...
kill -SIGNALTOSPEED rsyncpid

Связанный контент