29. 4. 2015

Unix - paralelné kopírovanie súborov

Niekedy je potrebné prekopírovať naraz veľký počet súborov medzi servrami a paralelným behom sa ušetrí veľa času.
Nižšie uvedený skript kopíruje paralelne 2 procesmi (premenná "pro") súbory uvedené aj s cestami v súbore "datafiles_list_ESKVPL". Aktuálne kopírovaný súbor v poradí načíta do premennej "file" a do premennej "filec" skonvertuje zdrojovú na cieľovú cestu (v tomto prípade len odlišný jeden podadresár).
Kopírovanie prebieha v riadku "ssh".


#!/bin/ksh

# ------------------
# BK build 2
# SUBOR DATAFILES VYGENEROVAT CEZ NIS_MAIN_FN A FUNKCIU GET DATA FILES
# STIAHNUT SEM ZO VZDIALENEJ LOKALITY
# "datafiles_list_ESKVPP"

# taha zo vzdialenej lokality sem, nahradza nazov Sady v ceste
# --------------------

# CONFIG ===================
# ZDROJ, CIEL

dbz=ESKVPL
dbc=ESKVQL


# PAR PROCESOV
pro=2
# END CONFIG ===============

#cd /home/oracle/bk/copy
echo "`date +\"%d.%m.%Y %T\"`: zaciatok"
files=`cat datafiles_list_$dbz`
for file in $files;
do
  filec=`echo $file | sed -e 's/$dbz/$dbc/g'`
  pocet=`ps -ef | grep dd | grep of | grep $dbc | grep -v grep | wc -l`
  while [[ $pocet -ge $pro ]]
  do
    printf .
    sleep 5
    pocet=`ps -ef | grep dd | grep of | grep $dbc | grep -v grep | wc -l`
  done
 
print "`date +\"%d.%m.%Y %T\"`: copying $file"
#  echo " kopirujem $file do $filec"
  ssh 10.10.195.203 "dd if=$file bs=1024k" | dd of=$filec bs=1024k &
  sleep 1
done
until [[ $pocet -eq 0 ]]
do
  printf .
  sleep 5
  pocet=`ps -ef | grep dd | grep of | grep $dbc | grep -v grep | wc -l`
done
print "`date +\"%d.%m.%Y %T\"`: koniec"
exit




Komprimácia prenášaných dát


Ďalší (jednoduchší) skript na kopírovanie s priebežným gzipovaním (ak máme výkonné CPU, ale obmedzuje nás priepustnosť siete):


Súbor zoznam.txt si vygenerovať vopred, ja som ho vytvoril find-ami
find /u?/oracle/DBEI/redo -type f

find /u?/oracle/DBEB/redo -type f

find /u?/oracle/DBEI/data -type f

find /u?/oracle/DBEB/data -type f

Samotný skript, 6 paralelných procesov (resp 7):
#!/bin/ksh



echo "`date +\"%d.%m.%Y %T\"`: zaciatok"

files=`cat zoznam.txt`

for file in $files;

do

   pocet=`ps -ef | grep dd | grep of | grep -v grep | wc -l`

   while [[ $pocet -gt 6 ]]

   do

       printf .

       sleep 5

       pocet=`ps -ef | grep dd | grep of | grep -v grep | wc -l`

   done

   print "`date +\"%d.%m.%Y %T\"`: copying $file"

#        echo " kopirujem $file"

dd if=$file bs=1M | gzip -1 -c | ssh 10.215.12.175 "gzip -d -c | dd of=$file bs=1M" &
   sleep 1

done

until [[ $pocet -eq 0 ]]

do

   printf .

   sleep 5

   pocet=`ps -ef | grep dd | grep of | grep -v grep | wc -l`

done

print "`date +\"%d.%m.%Y %T\"`: koniec"

exit

Žiadne komentáre:

Zverejnenie komentára