6 Dicembre 2019 di Daniele Frulla
Viviamo in un mondo parallelo, il software utilizza sempre più processi paralleli per svolgere le proprie funzioni, come è nella realtà e nel corpo umano.
Eseguire una copia con rsync in serie è davvero lungo, soprattutto se a dover essere copiati sono Tera e Tera di Byte.
Qui di seguito propongo uno script per eseguire un copia in parallelo attraverso rsync di n cartelle.
#!/bin/bash
PWD=$(pwd)
LOG=$PWD/log.log
# Funzione per eseguire workers paralleli
function parallel_task() {
INIT=$(date)
worker $1 $2 $3 $4
END=$(date)
echo "Tempo impiegato: INIT: $INIT --> END: $END"
echo "----------------------------"
}
# Copy folder or other
function worker() {
FOLDER=$1
BASE_FOLDER=$2
DEST_IP=$3
DEST_PATH=$4
R=$(( $RANDOM % 10 + 1 ))
if [ "$FOLDER" = "lost+found" ]; then
echo "------- $FOLDER --------"
echo "Cartella lost+folder non la sincronizzo"
else
echo "---> Inizio SINCRO $BASE_FOLDER/$FOLDER"
/usr/bin/rsync -avtW $BASE_FOLDER/$FOLDER $DEST_IP:$DEST_PATH
echo "------- $FOLDER --------"
echo "La cartella $FOLDER sincronizzata..."
fi
}
export -f parallel_task
export -f worker
INITDATE=$(date)
FOLDER=<path_folder_to_copy>
DEST_IP=<dest_ip>
DEST_PATH=<dest_path>
echo "INIT : $INITDATE" > $LOG
ls -1t $FOLDER | xargs -I {} -P 5 -n 1 $SHELL -c "parallel_task {} $FOLDER $DEST_IP $DEST_PATH" >> $LOG
ENDDATE=$(date)
echo "END : $ENDDATE" >> $LOG
echo "---------------------------------------------" >> $LOG
echo >> $LOG
echo "INIT : $INITDATE" >> $LOG
echo "END : $ENDDATE" >> $LOG
Lo script è semplice e l’istruzione principale che esegue la copia in parallelo è questa:
ls -1t $FOLDER | xargs -I {} -P 5 -n 1 $SHELL -c "parallel_task {} $FOLDER $DEST_IP $DEST_PATH"
L’istruzione precedente segue la seguente procedura:
Spero che lo script ti sia utile.
Lascia un commento