
¿Cuáles son algunas soluciones para ejecutar la configuración dinámica del tráfico durante un script bash?después de que un comando ya haya comenzado? ¿Es esto siquiera posible?
Mi caso de uso es que estoy rsync
ejecutando un gran conjunto de discos en una ubicación de copia de seguridad remota y esto lleva muchas horas a través de Internet, por lo que me gustaría aplicar la configuración de tráfico a la línea donde rsync
se invoca, pero solo durante momentos específicos.
Digamos, por ejemplo, que el cronograma actual es reducir las cargas a 1000 kilobytes por segundo (1,0 MB/s) de 5 a. m. a 10 a. m. Y de 3 p. m. a 9 p. m.
He buscado --bwlimit=1000
pero rsync
esta forma rsync
durante todo el tiempo que se ejecuta,no sólo los plazos de configuración deseados.
¿Es posible reducir la velocidad rsync
una vez que ha comenzado? Porque si eso es posible de alguna manera, esa sería mi solución.
He visto a gente sugerirlo wondershaper
, pero me pregunto si esto podría "activarse y desactivarse" mediante programación. Y en caso afirmativo, ¿cómo hacerlo?
Aquí hay una maqueta que he pirateado usando generosas contribuciones de Stackoverflow, que brinda la funcionalidad de especificar y verificar un cronograma (basado en la hora, lo cual está bien para mis necesidades en este momento)...
#!/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
Respuesta1
rsync
no se puede cambiar dinámicamente su parámetro de límite de ancho de banda.
Sin embargo podrías
- Divida el trabajo en varias tareas más pequeñas.donde cada uno tendrá un límite de peso corporal específico según el momento en que comienza, por ejemplo
por ejemplo
rsync a b c d e target:/dir/
to
rsync --bw-limit=bw1 a target:/dir/
...
rsync --bw-limit=bw2 e target:/dir/
- Usa la
--time-limit=MINS
opción
rsync
es inteligente y no rehará lo que acaba de hacer, si los archivos están sincronizados, por lo que podría ejecutar rsync
durante 1 hora con un límite de bw bw1, luego reiniciarlo con bw2, etc. (y pausarlo si es necesario), o combinar con la solución anterior.
rsync --bw-limit=bw1 --time-limit=60 ...
rsync --bw-limit=bw2 --time-limit=60 ...
- Cambiar sincronización
Si lo desea, rsync
es de código abierto y puede agregar algún código para rsync
responder dinámicamente a alguna señal (señalymatar) que cambiaría las opciones internas (es posible que también tenga que cambiar el demonio rsync de destino dependiendo del código)
rsync --my-new-version ...
kill -SIGNALTOSLOW rsyncpid
...
kill -SIGNALTOSPEED rsyncpid