LINUX.ORG.RU
решено ФорумAdmin

bash rsync backup problem

 ,


1

2

Привет! В попытках написать свой первый скрипт столкнулся с проблемой. При попытке его запуска получаю ошибку - Ошибка синтаксиса, неожиданный конец файла. Ошибка указывает на строку, следующую за последней, пустую. Возможно я пропустил где-то fi, не закрыл скобочку или что-то в этом духе, но я смотрю на эти 50 строк так долго, что в упор не вижу ошибки. Помогите пожалуйста, уважаемые) Так же с удовольствием послушаю как можно улучшить и упростить этого монстра)

#!/bin/bash
#
Source="/dir/to/source/"
NAS="//dir/to/network_share/"
Mountpoint="/mnt/nas/dir/"
Log="/dir/to/logs/rsyncing.log" # предполагается запуск скрипта с перенаправлением вывода в лог файл, который, в случае ошибки, пересылается на почту
Log_email="log@email.ru"
Success="0"
#
echo "Start time - $(date) "
if [ -d $Mountpoint ]
	then
		echo "Mountpoint already exists!"
	else
		echo "Creating mountpoint..."
		mkdir $Mountpoint
fi
sleep 3
#
mount | grep "$NAS"
if [ "$?" -eq $Success ]
	then
		echo "NAS server already mounted"
	else
		echo "Mount external storage..."
		mount.cifs  $NAS $Mountpoint -o username=login,password=pass
fi
sleep 3
#
mount | grep "$NAS"
if [ "$?" -eq $Success ]
	then
		echo "NAS mounted successfully!"
		echo "Synchronizating files from $(uname -n) to NAS..."
		rsync --recursive --links --times --perms --verbose --update $Source $Mountpoint
		wait
		echo "Synchronization completed at $(date)"
		sleep 3
		echo "Umounting NAS server..."
		umount $Mountpoint
		sleep 3
		echo "Removing mountpoint..."
		rmdir $Mountpoint
		sleep 3
	else
		echo "Error code "$?", rSynchronization from $(uname -n) to NAS failed, $(date) "
		sleep 3
		mail -s "rSync from $(uname -n) to NAS failed" "$Log_email" < $Log
fi
#
echo "Stop time - $(date) "

Ответ на: комментарий от shrm
mount.cifs  $NAS $Mountpoint -o username=login,password=pass

нет, cifs монтируется так, на сколько мне известно. По крайней мере отдельно эта команда работает

mount.cifs //192.168.4.65/temp /mnt/temp -o username=login,password=pass

strnd ()
if [ -d $Mountpoint ]
	then
		echo "Mountpoint already exists!"
	else
		echo "Creating mountpoint..."
		mkdir $Mountpoint
fi

Проще:

mkdir -pv "$Mountpoint"

Кавычки нужны, в противном случае шелл прочитает все спецсимволы из переменной, если они там будут. Не забудьте окавычить остальные переменные.

mount | grep "$NAS"
if [ "$?" -eq $Success ]

Правильно:

if mount | grep "$NAS"; then ...

Ошибки не вижу, но исправьте сначала это, а дальше, может быть, и сами поймёте, в чём дело.

AITap ★★★★★ ()
Последнее исправление: AITap (всего исправлений: 1 )

man dos2unix

и не редактируй скрипты в винде

anonymous ()

Много ненужной обвязки. Вместо

if [ -d $Mountpoint ]
	then
		echo "Mountpoint already exists!"
	else
		echo "Creating mountpoint..."
		mkdir $Mountpoint
fi
я бы предложил
[ -d "$mountpoint" ] || { mkdir -pv "$mountpoint" || exit 1; }
Работа программы должна идти молча, если она делает то, что от неё ожидается, и о чём пользователю каждый раз помнить необязательно.

Зачем sleep? А это на чемодане через Китай

mount | grep "$NAS"
if [ "$?" -eq $Success ]
	then
		echo "NAS server already mounted"
	else
		echo "Mount external storage..."
		mount.cifs  $NAS $Mountpoint -o username=login,password=pass
fi
Что мешает сделать просто
cat /proc/mounts | grep "$NAS" || { mount -v … || exit 2; }
// выхлоп mount’ом без ключей списка примонтированных ФС оставлили только из соображений совместимости, по-хорошему этот список надо брать из /proc/mounts. И да, если уж сравниваешь результат $?, то делать это нужно (в данном случае – именно нужно) проще –
[ $? -eq 0 ]
$? – это число всегда, это встроенная в баш переменная, тип которой заранее определён. Кроме того, оператор -eq сравнивает только числа, а Success свой ты задал как строку – ноль ведь в кавычках.

wait

Ты ещё не форкал rsync и не юзал COPROC, чтобы у тебя появились какие-то асинхронные с текущим потоком процессы.

rmdir $Mountpoint

Нафига её удалять? Вот так

echo "Error code "$?", rSynchronization from $(uname -n) to NAS failed, $(date) "
никто не экранирует. Если ты хотел экранировать $?, но она как раз оказалась вне кавычек. Тем не менее, они ей и ненужны, можно было просто вставить переменную в текст как есть, i.e. «какой-то текст $? текст идёт дальше».

rSynchronization

Что это?

rSync

Программа называется rsync http://rsync.samba.org/

rSync from $(uname -n) to NAS failed

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

# предполагается запуск скрипта с перенаправлением вывода в лог файл

Тогда там в начале должно быть что-то типа

exec &>$log
Как монтировать CIFS выше уже рассказали вроде.

Минутка брюзжания.

Start time - $(date)

Или тире или двоеточие, но никак не дефис.

Synchronizating

Ну ё-моё! Глагол в инфинитиве – to synchronize, значит, длительное – synchronizing, не надо ничего вымудрять, не знаешь английский – пиши по-русски и оставляй мыло для саппорта.

«NAS server already mounted»
«Umounting NAS server...»
«Mountpoint already exists!»
«Synchronization completed at $(date)»

Почему у тебя знаки препинания в конце предложения появляются через раз?

Deleted ()
Последнее исправление: fargred (всего исправлений: 1 )
Ответ на: комментарий от Deleted

Вот это разнос! Благодарю за потраченное время. Всем спасибо, все заработало)

strnd ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.