내 백업 스크립트가 tar.gz 파일을 빌드하고 scp를 통해 보낼 수 없는 이유는 무엇입니까?

내 백업 스크립트가 tar.gz 파일을 빌드하고 scp를 통해 보낼 수 없는 이유는 무엇입니까?

MySQL 백업을 자동화하고 결과 파일을 다른 서버로 전송하는 스크립트를 생성하려고 합니다.

덤프 파일을 생성했지만 그 이후로 많은 진전이 없었습니다. 지금까지의 스크립트는 아래에 붙여넣었습니다.

#!/bin/bash

# database credentials
DATABASEHOST="<url>"
DATABASEUSER="<user>"
DATABASEPASSWORD="<password>"
DATABASESCHEMA="<schema>"
DATABASEENV="<env>"

# Local directory of mysqldump file
LOCALDIR=/home/<user>/db-bkp

# Temporary directory for compressed file
TEMPDIR=/home/<user>/tmp

# Remote Directory for backups.
REMOTEDIR=/home/<user>/db-bkp

# Backup host to login to
BACKUPHOST=<backup-host>
#--- end config


echo $(date +%H:%M)
echo "Creating the MySQL dump" 
mysqldump --host="$DATABASEHOST" --user="$DATABASEUSER" --password="$DATABASEPASSWORD" --single-transaction "$DATABASESCHEMA" > "$LOCALDIR"/"$(date +%Y%m%d)_bkp_$DATABASESCHEMA.sql"

#echo "Generating md5sum"
md5sum "$LOCALDIR"/* > "$LOCALDIR"/checklist.chk

#echo "Compressing the dump and checklist"
tar -cvzf "$TEMPDIR"/"$(date +%Y%m%d"_"$DATABASEENV"_"$DATABASESCHEMA".tar.gz "$LOCALDIR"/*

#echo "Sending the compressed file to d2"
scp "$TEMPDIR"/"$DATABASESCHEMA".tar.gz "$BACKUPHOST":"$REMOTEDIR"

#echo "Removing generated files"
#rm "$LOCALDIR"/checklist.chk > /dev/null 2>&1

#rm "$LOCALDIR"/"$(date +%Y%m%d)_bkp_$DATABASESCHEMA.sql" > /dev/null 2>&1

#rm "$TEMPDIR"/"$DATABASESCHEMA".tar.gz > /dev/null 2>&1

echo $(date +%H:%M)

아직 테스트 중이기 때문에 수동 실행을 많이 했는데 최근 몇 번의 실행에서 덤프 파일과 md5sum 해시를 생성했지만 거기서 멈췄습니다.

<user>@<host>:~/db-bkp$ ./dev_backup.sh 
10:45
Creating the MySQL dump
./dev_backup.sh: line 48: unexpected EOF while looking for matching `"'
./dev_backup.sh: line 51: syntax error: unexpected end of file

흥미로운 점은 48행과 51행이 주석 처리되어 있다는 것입니다. 여기서 무슨 일이 일어나고 있는 걸까요?

답변1

위 코드의 경우 "bash -n"을 실행하면 다음과 같은 출력이 제공됩니다.

line 42: unexpected EOF while looking for matching `"'
line 45: syntax error: unexpected end of file

따라서 tarball 생성 명령을 다음과 같이 변경하십시오.

tar -cvzf "$TEMPDIR"/$(date +%Y%m%d)"_"$DATABASEENV"_"$DATABASESCHEMA".tar.gz" "$LOCALDIR"/*

나는 이것이 효과가 있다고 생각합니다.

답변2

사용되는 인용문 수를 최소화하여 이를 수행할 수 있습니다.

tar -cvzf \
    "$TEMPDIR/$(date '+%Y%m%d')_$DATABASEENV\_$DATABASESCHEMA.tar.gz" \
    "$LOCALDIR"/* \
;

$(date..따옴표의 밀도로 인해 쉽게 발견되지 않는 명령의 닫는 괄호를 놓쳤습니다 .

답변3

이게 더 예뻐요

tar czvf ${TEMPDIR}/$(date +%Y%m%d)_${DATABASEENV}_${DATABASESCHEMA}.tar.gz ${LOCALDIR}/*

관련 정보