SCP 파일의 스크립트는 수동으로 작동하지만 cron을 통해서는 작동하지 않습니다.

SCP 파일의 스크립트는 수동으로 작동하지만 cron을 통해서는 작동하지 않습니다.

CentOS 5.6을 사용하고 있습니다. 보안상의 이유로 실제 정보를 허위 정보로 변경해야 하므로 아래 코드에는 오타가 있을 수 있습니다.

백업 파일

#!/bin/bash
set -vx
rm -v /server/temp_db.gz
rm -v /server/temp_ftp.tar
rm -v /server/temp_backup.tar
mysqldump --all-databases | gzip -9 > /server/temp_db.gz
echo "$(date +%H:%M:%S) - finished DB backup"
tar -Pcf /server/temp_ftp.tar /server/public_html/
echo "$(date +%H:%M:%S) - finished FTP backup"
tar -Pcf /server/temp_backup.tar /server/temp_db.gz /server/temp_ftp.tar
DATE=`date +%A-%b-%d-%Y_%H-%M-%S`
sleep 120
/myfolder/upload.sh $DATE

upload.sh

#!/usr/bin/expect -f

# connect via scp
spawn scp /backup/temp_backup.tar [email protected]:/server/backup.tar
#######################
expect {
  -re ".*es.*o.*" {
    exp_send "yes\r"
    exp_continue
  }
  -re ".*sword.*" {
    exp_send "mypassword\r"
  }
}
interact

(위) 2개의 파일을 만들었습니다.

cd /myfolder/
chmod +x backup.sh
chmod +x upload.sh
./backup.sh

모든 것이 정상입니다. 생성 시간은 temp_backup.tar이전 타임스탬프보다 2초만 늦습니다. 명령을 수동으로 실행하는 데는 일반적으로 10~20초가 걸립니다.

rm -v /server/temp_db.gz
+ rm -v /server/temp_db.gz
removed `/server/temp_db.gz'
rm -v /server/temp_ftp.tar
+ rm -v /server/temp_ftp.tar
rm: cannot remove `/server/temp_ftp.tar': No such file or directory
rm -v /server/temp_backup.tar
+ rm -v /server/temp_backup.tar
rm: cannot remove `/server/temp_backup.tar': No such file or directory
mysqldump --all-databases | gzip -9 > /server/temp_db.gz
+ mysqldump --all-databases
+ gzip -9

echo "$(date +%H:%M:%S) - finished DB backup"
date +%H:%M:%S
++ date +%H:%M:%S
+ echo '20:50:16 - finished DB backup'
20:50:16 - finished DB backup
tar -Pcf /server/temp_ftp.tar /server/public_html/
+ tar -Pcf /server/temp_ftp.tar /server/public_html/
echo "$(date +%H:%M:%S) - finished FTP backup"
date +%H:%M:%S
++ date +%H:%M:%S
+ echo '20:50:19 - finished FTP backup'
20:50:19 - finished FTP backup
tar -Pcf /server/temp_backup.tar /server/temp_db.gz /server/temp_ftp.tar
+ tar -Pcf /server/temp_backup.tar /server/temp_db.gz /server/temp_ftp.tar
DATE=`date +%A-%b-%d-%Y_%H-%M-%S`
date +%A-%b-%d-%Y_%H-%M-%S
++ date +%A-%b-%d-%Y_%H-%M-%S
+ DATE=Friday-Dec-16-2011_20-50-24
sleep 120
+ sleep 120
/myfolder/upload.sh $DATE
+ /myfolder/upload.sh Friday-Dec-16-2011_20-50-42
spawn scp /server/temp_backup.tar [email protected]:/backup/backup_Friday-Dec-16-2011_20-50-42.tar
Password:
temp_backup.tar                              100%  516MB  23.5MB/s   00:22

이제 cron 작업을 설정했습니다.

* */10 * * * /myfolder/backup.sh 2>&1 > /myfolder/backup.log

cron 작업이 수동으로 실행하는 것과 동일하게 실행되었는지 확인했으며 root파일 소유자는 root:root두 파일 모두 권한이 있지만 -rwxr-xr-x어떤 이유로 여전히 작동하지 않습니다. 다시 한 번 생성 전후의 타임스탬프를 기록해 두세요 backup_temp.tar. 단 2초 간격입니다.

rm -v /server/temp_db.gz
+ rm -v /server/temp_db.gz
removed `/server/temp_db.gz'
rm -v /server/temp_ftp.tar
+ rm -v /server/temp_ftp.tar
removed `/server/temp_ftp.tar'
rm -v /server/temp_backup.tar
+ rm -v /server/temp_backup.tar
removed `/server/temp_backup.tar'
mysqldump --all-databases | gzip -9 > /server/temp_db.gz
+ mysqldump --all-databases
+ gzip -9
echo "$(date +%H:%M:%S) - finished DB backup"
date +%H:%M:%S
++ date +%H:%M:%S
+ echo '20:41:05 - finished DB backup'
20:41:05 - finished DB backup
tar -Pcf /server/temp_ftp.tar /server//public_html/
+ tar -Pcf /server/temp_ftp.tar /server/public_html/
echo "$(date +%H:%M:%S) - finished FTP backup"
date +%H:%M:%S
++ date +%H:%M:%S
+ echo '20:41:07 - finished FTP backup'
20:41:07 - finished FTP backup
tar -Pcf /server/temp_backup.tar /server/temp_db.gz /server/temp_ftp.tar
+ tar -Pcf /server/temp_backup.tar /server/temp_db.gz /server/temp_ftp.tar
DATE=`date +%A-%b-%d-%Y_%H-%M-%S`
date +%A-%b-%d-%Y_%H-%M-%S
++ date +%A-%b-%d-%Y_%H-%M-%S
+ DATE=Friday-Dec-16-2011_20-41-09
sleep 120
+ sleep 120
/myfolder/upload.sh $DATE
+ /myfolder/upload.sh Friday-Dec-16-2011_20-39-08
spawn scp /server/temp_backup.tar [email protected]:/backup/backup_Friday-Dec-16-2011_20-39-08.tar^M
Password:

답변1

경로를 확인하세요! cron 작업을 생성할 때 흔히 저지르는 실수는 cron이 실행될 때의 경로가 사용자가 파일을 실행할 때의 경로와 동일하다고 가정하는 것입니다. mysqldump 및 Expect는 상대 경로가 아닌 전체 경로를 제공해야 할 수도 있습니다.

관련 정보