이 스크립트를 사용하여 rsync를 통해 원격 파일을 백업하고 있습니다. 문제는 시작하려고 할 때 발생하며 처리 방법을 알 수 없는 오류가 출력됩니다. 제안해 주시면 감사하겠습니다.
#!/bin/bash
#VARIABLES DEFINE TO STORE COMMANDS AND VALUES.
TODAY_DATE=$(date +%Y%m%d) #Store current date
MKDIR=$(which mkdir) #store mkdir command
RSYNC=$(which rsync) #store rsync command
DEL=$(which rm) #store rm command
TAR=$(which tar) #store tar command
MAIL=$(which mail) #store mail command
LOGFILE='/tmp/backup.log' #store path of log file & touch this file in /tmp directory
#ADD EMAIL ID IN MAILTO FOR GETTING NOTIFICATIONS IN MAIL
MAILTO='[email protected]'
BODY="nnFor more information please check $LOGFILE.nnnThanks,n$0"
#CREATE DIRECTORY TO STORE BACKUP FILES
PRODBACKDIR=$TODAY_DATE/var/production-backup/
#IF CONDITION CHECK DIRECTORY IS PRESENT OR NOT AND IF NOT PRESENT CREATE DIRECTORY WITH PROVIDED DIR STRUCTURE.
if [ ! -d "{$PRODBACKDIR}" ] && [ `$MKDIR -p "$PRODBACKDIR"` ];
then
echo -e "Directory Created for site";
fi
#if [ ! -d “{$BLOGBACKDIR}” ] && [ `$MKDIR -p “$BLOGBACKDIR”` ];
#then
#echo -e “Directory Created for Production Blog Codebase”;
#fi
#REMOVE BACKUP FILES 7 DAYS OLDER
find /var/production-backup/ -mtime +7 -exec rm -rf {} ;
#RSYNC COMMAND TO SYNC CODE OR DATA FROM REMOTE SERVER TO LOCAL USING SSHPASS TO PASS PASSWORD OF REMOTE SERVER
sshpass -p 'password' rsync –progress -rPz -e ssh backups@remotehost:/var/www/website $PRODBACKDIR
#FOR LOOP TO CHECK BACKUP FILES AND COMPRESSED IT WITH .TAR.GZ FILE WHICH SAVES DISK SPACE ON LOCAL SYSTEM AND ALSO REMOVE NON COMPRESSED FILES.
for DOC in $PRODBACKDIR; do
echo "`date '+%Y-%m-%d'` : ${DOC} backup started";
if [ -d ${DOC} ]; then
FILENAME=$(echo $DOC | awk -F '/' '{print $NF}');
TARFILE="$FILENAME-$TODAY_DATE.tar.gz";
echo "`date '+%Y-%m-%d'` : ${DOC} archiving started.";
$TAR -cvzf $PRODBACKDIR/$TARFILE $PRODBACKDIR/$FILENAME;
#IF CONDITION CHECK ERRORS WHILE CREATING TAR.GZ AND REPORT IF TAR COMMAND FAILS.
if [ $? -eq 0 ]; then
echo "`date '+%Y-%m-%d'` : ${DOC} archiving done."
$DEL -rf $PRODBACKDIR/$FILENAME
echo "`date '+%Y-%m-%d'` : ${DOC} deleting of non-archive directory done."
else
echo "Error while creating tar."
echo -e "Error while creating tar file.$BODY" | $MAIL -s 'Error : Creating tar file' $MAILTO
exit 1
fi
fi
echo "`date '+%Y-%m-%d %H:%M:%S'` : ${DOC} backup completed"
done
#SEND THE NOTIFICATION EMAIL AFTER SUCCESSFUL COMPLETION OF BACKUP.
echo -e "Backups successfully done for Production codebase" | $MAIL -s "Completed : Backup finished." $MAILTO
실수:
find: missing argument to `-exec'
Try 'find --help' for more information.
Unexpected remote arg: backups@remotehost:/var/www/website
rsync error: syntax or usage error (code 1) at main.c(1361) [sender=3.1.2]
2018-08-02 : 20180802/var/production-backup/ backup started
2018-08-02 : 20180802/var/production-backup/ archiving started.
20180802/var/production-backup/
2018-08-02 : 20180802/var/production-backup/ archiving done.
2018-08-02 : 20180802/var/production-backup/ deleting of non-archive directory d one.
2018-08-02 06:58:59 : 20180802/var/production-backup/ backup completed
답변1
;
쉘로부터 보호하려면 실행된 명령의 끝 부분을 따옴표 로 묶어야 합니다. 그렇지 않으면 쉘은 이를 명령의 끝으로 처리합니다.find
-exec
find
변화
find /var/production-backup/ -mtime +7 -exec rm -rf {} ;
도착하다
find /var/production-backup/ -mtime +7 -exec rm -rf {} ';'
또는
find /var/production-backup/ -mtime +7 -exec rm -rf {} \;
아니면 그냥
find /var/production-backup/ -mtime +7 -delete
당신이 find
그것을 지원한다면.
또한 명령은 find
아래 디렉터리, 파일 또는 기타 콘텐츠를 구별하지 않습니다 /var/production-backup
. 예를 들어 /var/production-backup
디렉터리 자체가 7일 이상 수정되지 않은 경우(파일이나 디렉터리가 생성/삭제되지 않았기 때문에) 전체 파일 계층이 삭제됩니다.
일반 파일만 삭제하려면 다음을 사용하세요.
find /var/production-backup/ -type f -mtime +7 -delete
관련된:
코드에 대한 추가 참고 사항:
당신이 그렇게한다면
TAR=$(which tar)
그리고 나중에 사용
$TAR ...
아카이브를 생성 tar
한 다음 직접 사용할 수도 있습니다 tar
. 바이너리 TAR
가 직접 사용된 것처럼 검색되므로 바이너리 경로를 설정해도 이점이 없습니다. 변수에 저장된 다른 명령도 마찬가지입니다.tar
which
PATH
tar
테스트는 [ `$MKDIR -p "$PRODBACKDIR"` ]
반환 상태를 직접 테스트해야 합니다 mkdir
. 이 mkdir
유틸리티는 테스트용 출력을 생성하지 않습니다. 또한 다음을 사용하기 전에 디렉토리가 존재하는지 테스트할 필요가 없습니다 mkdir -p
.
if mkdir -p "$PRODBACKDIR"; then
echo 'Directory Created for site'
fi
{$PRODBACKDIR}
또한 이를 사용하여 디렉토리의 경로 이름을 추가하고 있다는 점에 {
유의 하십시오. }
쓸모없는 디렉토리 테스트에서 진행되었기 때문에 아무런 피해도 입지 않았습니다(테스트는 항상 실패했습니다). echo -e
여기서도 필요하지 않습니다 .
{}
변수 확장에서는 변수 이름을 둘러쌀 필요가 없습니다 . 이를 작성해야 하는 유일한 경우 ${variable}
는 확장이 문자열의 일부이고 확장 바로 뒤의 문자가 아래와 같이 변수 이름의 유효한 문자인 경우입니다 "${variable}x"
. 너하다그러나 모든 변수에는 확장을 위해 큰따옴표가 필요합니다.
옵션은 하나 대신 두 개의 대시로 작성됩니다 --progress
. rsync
또한 -e ssh
내가 아는 한 이것은 rsync
오랫동안 기본값이었습니다.
선
FILENAME=$(echo $DOC | awk -F '/' '{print $NF}');
이는 표준 매개변수 대체를 사용하여 다음과 같이 작성할 수 있습니다.
FILENAME=${DOC##*/}
$?
예를 들어, 대신에 .
tar ...
if [ $? -eq 0 ]; then ...
하다
if tar ...; then ...
또한 printf
변수 데이터를 출력하는 데 사용하는 것도 고려해 보십시오.
TODAY_DATE
오늘 날짜를 저장할 문자열을 정의했지만 두 번만 사용했습니다. 그러나 형식이 약간 다른 호출이 적어도 세 개 이상 있습니다 date
. ( %Y-%m-%d
대체 가능 %F
, 참조 man strftime
)
;
같은 줄의 다른 명령이 바로 뒤에 나오지 않는 명령 끝에 추가할 필요는 없습니다 . 개행 문자는 명령 종결자로 사용됩니다.
등. ,...
또한 기존 백업 소프트웨어를 살펴보는 것이 좋습니다. 예를 borgbackup
들어 추천할 수 있습니다 restic
.
관련된: