nixp.ru v3.0

22 октября 2017,
воскресенье,
22:22:51 MSK

DevOps с компанией «Флант»
Аватар пользователя ARS
ARS написал 25 июня 2010 года в 13:50 (2625 просмотров) Ведет себя как мужчина; открыл 1 тему в форуме, оставил 9 комментариев на сайте.

 

Идентичные, как мне казалось команды дают абсолютно разный результат.
root@asr-desktop:/# rsync -a -v «/media/temp/Источник 1»  /media/temp/dest/cur

sending incremental file list

sent 295 bytes  received 14 bytes  618.00 bytes/sec

total size is 636477  speedup is 2059.80

А при подстановке переменной не работает.
root@asr-desktop:/# SOURCE=«\»/media/temp/Источник 1\"»;echo $SOURCE;rsync -a -v  $SOURCE /media/temp/dest/cur

/media/temp/Источник 1»

sending incremental file list

rsync: change_dir «/»/media/temp» failed: No such file or directory (2)

rsync: link_stat «/1»» failed: No such file or directory (2)

sent 12 bytes  received 12 bytes  48.00 bytes/sec

total size is 0  speedup is 0.00

rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1060) [sender=3.0.7]

Подскажите кнонибудь что я делаю не так?

bushmen

Попробуйте так:

SOURCE="/media/temp/Источник 1»

rsync -av «$SOURCE» /media/temp/dest/cur

 

ARS

Так кавычки не передаются

следовательно воспринимается как 2 пути:

  1. /media/temp/Источник
  2. 1

 

bushmen

Правильно, кавычки и не должны в операторе присваивания передаваться, т.к. в переменной нам нужен путь, а не строка символов, которая начинается и заканчивается кавычками. Внутри команды sync для этого и заключаем переменную в кавычки.

ARS

Работает. Спасибо.

А как передать несколько путей?

bushmen

Кто мешает написать скрипт, который последовательно будет скидывать?! В мане написано, что можно несколько источников использовать, но только с удаленных хостов (хотя никто не мешает указать localhost). Но при этом запрашивается пароль пользователя, от которого работаешь — на мой взгляд не удобно.

ARS

несколько источников работает локально.

Но как их подставить через переменную?

#Папка назначения
DEST=/home/asr/temp/dest
#Папки источники
SOURCE[0]="/home/asr/temp/Источник 1"
SOURCE[1]="/home/asr/temp/source"
 
#-------------------------------------------------------------------------
 
LASTDIR=`cat $DEST/lastbackup`
CURDIR=`date +%F_%H_%M`
for i in ${SOURCE[@]}; do
echo $i
echo "-----------"
rsync -a -v --link-dest=../$LASTDIR "$i" $DEST/$CURDIR/
echo "-------------------------"
done

Так неработает.

 

bushmen

Это все Вы городите ради бэкапа? Не проще ли воспользоваться tar’ом?!

SRC1=/home/asr/temp/Источник 1

SRC2=/home/asr/temp/source

CURDIR=`date +%F_%H-%M`

mkdir -p /home/asr/temp/dest/«$CURDIR»

tar -cpvf ~/«$CURDIR»/test.tar «$SRC1» «$SRC2»

Если источников много, то можно поместить их перечень в файл.

ARS

А tar умеет --link-dest ?

 

ARS

А также хотелось узнать почему не работает, чтобы в следующий раз не делать такихже ошибок.

bushmen
ARS

А tar умеет --link-dest ?

 

А зачем Вам нужны hardlink’и — Вы же все равно каждый раз кидаете в новые папки?

ARS

из новой папки, если фаил не изменился, делается hardlink’и на предидущую. Место не естся, получается чтото типа snapshot-ов. Очень удобно.

bushmen
#Папка назначения
DEST=[b]/[/b]home[b]/[/b]asr[b]/[/b]temp[b]/[/b]dest
#Папки источники
SOURCE[b][[/b]0[b]][/b]="/home/asr/temp/Источник 1"
SOURCE[b][[/b]1[b]][/b]="/home/asr/temp/source"
 
#-------------------------------------------------------------------------
 
LASTDIR=`[b]cat[/b] $DEST[b]/[/b]lastbackup`
CURDIR=`[b]date[/b] +[b]%[/b]F_[b]%[/b]H_[b]%[/b]M`
[b]for[/b] i [b]in[/b] "$[b]{[/b]SOURCE[b][[/b][b]@[/b][b]][/b][b]}"[/b]; [b]do[/b]
[b]echo[/b] $i
[b]echo[/b] "-----------"
rsync -a -v --link-dest="$LASTDIR" "$i" "$DEST[b]/[/b]$CURDIR[b]"[/b]
[b]echo[/b] "-------------------------"
[b]done[/b]

Как говорится, найди 3 отличия.

bushmen
LASTDIR="$DEST[b]/[/b]lastbackup" - ошибочка одна :)

 

ARS
bushmen
LASTDIR="[b] [/b]$DEST[b]/[/b]lastbackup" - ошибочка одна :)

 

LASTDIR=`cat $DEST/lastbackup` — правильно. В этом файле записывается название директории последнего бэкапа.

«$LASTDIR» и «$DEST/$CURDIR» в кавычки заключать не надо, т.к в их названиях не используются пробелы.

И, вообще, если не использовать пробелы в названиях источников -  все работает замечательно.

bushmen
ARS
bushmen
LASTDIR="[b] [/b]$DEST[b]/[/b]lastbackup" - ошибочка одна :)

 

LASTDIR=`cat $DEST/lastbackup` — правильно. В этом файле записывается название директории последнего бэкапа.

«$LASTDIR» и «$DEST/$CURDIR» в кавычки заключать не надо, т.к в их названиях не используются пробелы.

И, вообще, если не использовать пробелы в названиях источников -  все работает замечательно.

 

В Вашем случае не используются пробелы, а в каком-то  используются — надо сразу универсальные решения делать

Вот это взято из man rsync: «--link-dest=DIR         hardlink to files in DIR when unchanged» — как я понимаю, все-таки должна быть директория.

ARS
bushmen

Вот это взято из man rsync: «--link-dest=DIR         hardlink to files in DIR when unchanged» — как я понимаю, все-таки должна быть директория.

Это и есть директория, путь к которой записан в фаил $DEST/lastbackup.

А проблемма со списком источников, содержащих пробелы, так и не решена.

bushmen
ARS
bushmen

Вот это взято из man rsync: «--link-dest=DIR         hardlink to files in DIR when unchanged» — как я понимаю, все-таки должна быть директория.

Это и есть директория, путь к которой записан в фаил $DEST/lastbackup.

А проблемма со списком источников, содержащих пробелы, так и не решена.

Как это не решена? Я же написал

[b]for[/b] i [b]in[/b] "$[b]{[/b]SOURCE[b][[/b][b]@[/b][b]][/b][b]}"[/b]; [b]do
Все прекрасно работает[/b]

 

ARS
bushmen
[b]for[/b] i [b]in[/b] "$[b]{[/b]SOURCE[b][[/b][b]@[/b][b]][/b][b]}"[/b]; [b]do
Все прекрасно работает[/b]

 

Действительно работает. Не заметил сразу.

Вот окончательный вариант

#!/bin/bash
#backup.sh
#Скрипт архивирования в виде снапшотов с использованием жестких ссылок
#-----------------------------------------------------------------------
 
#Папка назначения
DEST=/home/asr/temp/dest
#Папки источники
SOURCE[0]="/home/asr/temp/Источник 1"
SOURCE[1]="/home/asr/temp/source"
 
#-------------------------------------------------------------------------
 
LASTDIR=`cat $DEST/lastbackup`
CURDIR=`date +%F_%H_%M`
 
for i in "${SOURCE[@]}";do
 rsync -a -v --ignore-errors  --no-whole-file --link-dest=../$LASTDIR "$i" $DEST/$CURDIR/ >> $DEST/backuplog.log
 echo "#------------------------------------------------------------------------" >> $DEST/backuplog.log
done
 
echo $CURDIR >$DEST/lastbackup

Спасибо огромное за помощь.