Processi Paralleli Da Shell Bash Script

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:

  • lista la cartella ordinata dai file più modificati a quelli meno modificati;
  • xargs trasforma il nome della cartella listato in una instruzione di shell (richiama la funzione parallel_task che copia la cartella selzionata con rsync)
  • nell’eseguzione xargs prende esattamente 5 argomenti ed avvia 5 processi

Spero che lo script ti sia utile.


Lascia un commento

Il tuo indirizzo email non sarà pubblicato.


Copyright di Caterina Mezzapelle Part. I.V.A. 02413940814 - R.E.A. 191812