Назад | Перейти на главную страницу

Как заставить работать резервную копию SVN?

Я пытаюсь получить сценарий Вот работаю на моем сервере Ubuntu для резервного копирования репозитория SVN через cron.

#!/bin/bash

BACKUP_DIR="/backup/repository"
REPOSITORY_DIR="/home/svn/repository"
#search in repository folder to find all the repository names
ls -Al --time-style=long-iso /home/svn/repository/ | grep '^d' | awk '{print $8}' | while read line
do
    if [ ! -d $BACKUP_DIR"/"$line ]; then
        mkdir $BACKUP_DIR"/"$line
    fi

    #Getting revision number
    REVISION=`cat $REPOSITORY_DIR"/"$line"/db/current" | awk '{print $1}'`

    #Archive last backup
    tar -czf $BACKUP_DIR"/"$line"-last.tar.gz" $BACKUP_DIR"/"$line"/"

    #Dangerous :)
    if [ -n "$BACKUP_DIR" ]; then
    rm -rf $BACKUP_DIR"/"$line"/*"
    fi

    #Check to see if exists a hot backup
    if [ -d $BACKUP_DIR"/"$line"/"$line"-"$REVISION ]; then
        echo "Skipping Backup ! Backup Already Exists"
    else
        echo "Doing backup for "$line
        /usr/bin/svn-hot-backup $REPOSITORY_DIR"/"$line $BACKUP_DIR"/"$line
    fi

done

Я изменил пути на правильные, и инструменты subversion установлены, однако я получаю следующие ошибки, если пытаюсь запустить sudo bash svnbackup.sh:

: command not foundline 2:
svnfullbackup.sh: line31: syntax error near unexpected token 'done'
svnfullbackup.sh: line31: 'done'

Полагаю, именно из-за этих ошибок cron не работал в отведенное время. Как я могу их исправить?

Кажется, я не могу найти ничего плохого в сценарии, за исключением того, что он не будет работать, если у вас есть имена репозиториев, содержащие пробелы ... так ли это?

Ошибка «команда не найдена» выглядит так, как будто она была перезаписана, что указывает на неправильный тип окончания строки. Бегать dos2unix в вашем файле сценария, чтобы исправить это. Возможно, это какой-то другой заблудший персонаж. Отобразите ваш скрипт, используя hexdump или cat -v чтобы раскрыть это. Эта проблема часто возникает, когда вы используете редактор Windows для файла Unix.

Вместо этой строки:

ls -Al --time-style=long-iso /home/svn/repository/ | grep '^d' | awk '{print $8}' | while read line

использовать это:

find "$REPOSITORY_DIR" -maxdepth 1 -type d | while read -r line

который не полагается на ls который не предназначен для использования в скриптах / каналах. Такой способ также с большей вероятностью будет работать в тех случаях, когда имена файлов содержат пробелы.

Вы можете цитировать так, как вы это делаете, но этот пример может быть лучше, поскольку он работает, если в именах файлов есть пробелы:

if [ ! -d "$BACKUP_DIR/$line" ]; then
    mkdir "$BACKUP_DIR/$line"

Лучше использовать $() вместо обратных кавычек и cat не требуется (также упрощенное цитирование):

REVISION=$(awk '{print $1}' "$REPOSITORY_DIR/$line/db/current" )

И есть еще места, где можно упростить цитирование.