Benutzer-Werkzeuge

Webseiten-Werkzeuge


linux:rsync_wrapper_script

Beispiel für ein rsync Skript

Aufgabe:

Mit gzip gezippte Archive vom Altsystem auf die neue Produktion kopieren, für jeden Kopiervorgang wird der Namen des aktuellen Backup Verzeichnis als Startparameter übergeben.

Ablauf:

  • Kopieren per rsync
  • Entpacken per gzip
  • Prüfen ob auf der lokalen und der Remote Seite die gleiche Anzahl der Dateien vorliegt
  • Setzen der Rechte auf den Oracle User

Vorbereitung:

Infos

Das Script

copy_rsync.sh
#!/bin/sh
#
# Script to start rsnc to copy archivelogs from old 9i enviroment to new prod
#
# crontab example
# Minute   Hour   Day of Month       Month          Day of Week        Command
# (0-59)  (0-23)     (1-31)    (1-12 or Jan-Dec)  (0-6 or Sun-Sat)
#30 16 12 2 * /backup/scripts/copy_pro_backup_archives.sh COPYTEST
 
########## Enviroment ##############
 
DAY_OF_WEEK=`date +%w`
export DAY_OF_WEEK
 
DAY=`date +"%m_%d_%y_%H_%M"`
export DAY
 
##############################
# Home of the scrips
SCRIPTPATH=$(cd ${0%/*} && echo $PWD/${0##*/})
SCRIPTS_DIR=`dirname "$SCRIPTPATH{}"`
 
##############################
#logfile
LOG=${SCRIPTS_DIR}/run_copy_job_${DAY}.log
 
##############################
# Parameter
DIRECTORY_NAME=$1
 
REMOTE_SERVER=gpi019i.pipperr.local
REMOTE_DIR=/backup
REMOTE_USER=oracle
 
LOCAL_DIR=/backup
LOCAL_HOST=`hostname`
LOCAL_ORA_USER=oracle
LOCAL_ORA_GROUP=oinstall
 
##############################
 
##############################
echo ------------- START JOB at "`date`"    ----  --------------  > "${LOG}" 2>&1
echo --                                                           >> "${LOG}" 2>&1
echo -- Info Parameter :: REMOTE_SERVER =${REMOTE_SERVER}         >> "${LOG}" 2>&1
echo -- Info Parameter :: REMOTE_DIR    =${REMOTE_DIR}            >> "${LOG}" 2>&1
echo -- Info Parameter :: LOCAL_HOST    =${LOCAL_HOST}            >> "${LOG}" 2>&1
echo -- Info Parameter :: LOCAL_DIR     =${LOCAL_DIR}             >> "${LOG}" 2>&1
echo -- Info Parameter :: DIRECTORY_NAME=${DIRECTORY_NAME}        >> "${LOG}" 2>&1
echo -- Info : Start rsync                                        >> "${LOG}" 2>&1
 
# get lock to prevent multiple runs
# set ${LOCKFILE} !
LOCKFILE=${SCRIPTS_DIR}/lock
exec 100>${LOCKFILE}_runStat;
 
if flock -n -x 100; then
echo "-- Info -- start the script in ${SCRIPTS_DIR}"    >> "${LOG}" 2>&1
else
    echo "Error -- Script is still running!" >> "${LOG}" 2>&1
    exit 1
fi
if [ !  -n "${DIRECTORY_NAME}" ]; then
   echo "Error -- Parameter 1 - the directory name is empty" >> "${LOG}" 2>&1
   echo "Error -- Parameter 1 - the directory name is empty"
   exit 1
fi
 
### copy the directory from the remote host ot the localhost
# watch the trailing / of the local directory!
# rsync Options z compress (only for not compressed files!)
#               h show human readable numbers
#               a is -rlptgoD  - archive setting to preserver the most features
#
#
/usr/bin/rsync -ahv ${REMOTE_USER}@${REMOTE_SERVER}:${REMOTE_DIR}/${DIRECTORY_NAME} ${LOCAL_DIR}/ >> "${LOG}" 2>&1
#
echo ---------------------------------------------------- >> "${LOG}" 2>&1
### unzip all files in the directory
echo -- Info : Start unzip at "`date`"                    >> "${LOG}" 2>&1
#
gzip -df ${LOCAL_DIR}/${DIRECTORY_NAME}/*.gz              >> "${LOG}" 2>&1
 
 
## check if all is transferd
LOCAL_GET_COUNT=`ls -la ${LOCAL_DIR}/${DIRECTORY_NAME}/*.arc | wc -l`
echo ---------------------------------------------------- >> "${LOG}" 2>&1
echo -- Info : found local files  :: ${LOCAL_GET_COUNT}    >> "${LOG}" 2>&1
REMOTE_GET_COUNT=`ssh ${REMOTE_SERVER} "ls -la ${REMOTE_DIR}/${DIRECTORY_NAME}/*.*" | wc -l`
echo -- Info : found REMOTE files :: ${REMOTE_GET_COUNT}    >> "${LOG}" 2>&1
echo ---------------------------------------------------- >> "${LOG}" 2>&1
echo -- Info set the user rights  >> "${LOG}" 2>&1
## set the rights of the directory ot the DB User
#
chown -R  ${LOCAL_ORA_USER}:${LOCAL_ORA_GROUP}  ${LOCAL_DIR}/${DIRECTORY_NAME}
#
 
############## Log file handling
#
# zip all log files older then 3 days
for i in `/usr/bin/find ${SCRIPTS_DIR} -ctime +72 | /bin/grep -i "\.log"`
do
  /bin/gzip -9 $i  >> "${LOG}" 2>&1
done
 
# delete all log files older then 14 days
for i in `/usr/bin/find ${SCRIPTS_DIR} -ctime +336 | /bin/grep -i "\log.gz"`
do
  rm $i   >> "${LOG}" 2>&1
done
 
echo ------------- FINISH JOB at "`date`"    ----  --------------  >> "${LOG}" 2>&1

Mögliche Fehler Quelle

Fehler:

protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(64) [sender=2.6.8]

Lösung:

Auf dem Remote Server wurde in der .bashrc eine .profile aufgerufen, die mit echo Text ausgibt, dieser Text „zerstört“ dann den Aufbau des rsync Protokolls. Dieser auskommentiert damit keine Ausgaben bei einem Login erzeugt werden.

Interessanterweise hat ein SSH Banner nicht den gleichen Effekt, das nervtötende Pseudo-Sicherheits-SSH Banner in dieser Umgebung konnte übersprungen werden.

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
"Autor: Gunther Pipperr"
linux/rsync_wrapper_script.txt · Zuletzt geändert: 2014/02/25 17:14 von Gunther Pippèrr