Какие есть решения для запуска динамического формирования трафика во время сценария bash после того, как команда уже запущена? Это вообще возможно?
Мой вариант использования: у меня rsync
работает на огромном наборе дисков в удаленное хранилище резервных копий, и это занимает много часов через Интернет, поэтому я хотел бы применить формирование трафика к строке, где rsync
вызывается, но только в указанное время.
Так скажем, например, текущее расписание состоит в том, чтобы уменьшить загрузку до 1000 килобайт в секунду (1,0 МБ / с) с 5:00 до 10:00 И с 15:00 до 21:00.
Я смотрел на --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
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 часа с ограничением bw bw1, затем перезапустите его с помощью bw2 и т.д. (и приостановите его, если это необходимо), или объедините с вышеуказанным решением.
rsync --bw-limit=bw1 --time-limit=60 ...
rsync --bw-limit=bw2 --time-limit=60 ...
Если тебе так хочется, rsync
с открытым исходным кодом, и вы можете добавить код, чтобы rsync
динамически отвечать на некоторый сигнал (сигнал и убийство), который изменит внутренние параметры (возможно, придется изменить целевой демон rsync, в зависимости от кода)
rsync --my-new-version ...
kill -SIGNALTOSLOW rsyncpid
...
kill -SIGNALTOSPEED rsyncpid