나는 기본적으로 zip 파일의 압축을 풀고 데이터베이스를 삭제하고 동일한 이름의 데이터베이스를 생성한 다음 zip 파일에서 생성된 sql 파일을 가져오는 backup_extract.sh라는 비교적 짧은 셸 스크립트를 설정하려고 합니다.
zip 파일은 별도의 서버에 생성된 다음 매일 해당 서버로 전송됩니다. 이는 WordPress 사이트의 간단한 데이터베이스 백업이며 스크립트는 WordPress 사이트의 1:1 복제본으로 새 서버의 데이터베이스를 복원하도록 설계되었습니다. 해당 서버는 백업 목적으로 다른 웹사이트를 사용합니다.
내가 겪고 있는 문제는 스크립트를 bash 실행하면 제대로 작동하지만 cron이 인계받게 하면 아무 일도 일어나지 않는 것 같다는 것입니다.
코드는 다음과 같습니다(분명히 mysql 사용자와 비밀번호, 전체 URL은 생략했지만 파일이 루트 디렉토리에서 오는 것처럼 파일의 정확한 경로를 사용하고 있음을 확신합니다).
cd /var/www/html/backups/database
mkdir /var/www/html/backups/database/$(date +%Y%m%d)
unzip /var/www/html/backups/database/*.zip -d /var/www/html/backups/database/$(date +%Y%m%d)
mv /var/www/html/backups/database/*.zip /var/ww/html/backups/database/$(date +%Y%m%d)
cd /var/www/html/backups/database/$(date +%Y%m%d)/dup-installer
mv /var/www/html/backups/database/$(date +%Y%m%d)/dup-installer/*.sql /var/www/html/backups/database/$(date +%Y%m%d)/dup-installer/database_$(date +%Y%m%d).sql
mysql -u USERNAME -p'PASSWORD' database -e \ 'DROP DATABASE database';
mysql -u USERNAME -p'PASSWORD' -e \ 'CREATE DATABASE database';
mysql -u USERNAME -p'PASSWORD' database < /var/www/html/backups/database/$(date +%Y%m%d)/dup-installer/database_$(date +%Y%m%d).sql
echo "Backup completed" >> /var/www/html/backups/database/$(date +%Y%m%d)/backup-status.txt
이제 이런 스크립트를 작성하는 것은 처음이므로 내가 뭔가 잘못하고 있다고 확신합니다. 하지만 이 스크립트의 기능을 설명하겠습니다.
첫째, crontab이 관련되어 있을 때 cd 명령이 어떤 작업을 수행하는지 모르겠지만, 만일의 경우에 대비한 것입니다. 내가 필요하지 않았다면.
두 번째 디렉터리는 현재 날짜를 사용하여 생성됩니다.
셋째, 방금 만든 폴더에 zip 파일을 추출합니다. 여기에서 상황이 복잡해집니다. 매일 새 zip 파일이 이 폴더로 이동되지만 이름은 다른 서버에서 프로그래밍 방식으로 생성되며 zip 파일의 이름을 정확하게 예측할 수 없으므로 해당 폴더에 있는 모든 zip 파일의 압축을 풀 수 있는 방법이 필요합니다. 이 폴더 - 압축이 풀리면 이동되므로 여러 개의 zip 파일을 한 번에 압축 해제하는 것에 대해 걱정할 필요가 없습니다.
넷째, 2번째 줄에서 생성한 폴더로 zip 파일이 이동됩니다.
다섯째, zip 파일에서 추출한 폴더에 CD를 넣습니다.
여섯째, 여기에 있는 모든 SQL 파일의 이름을 더 예측 가능한 이름으로 바꿉니다(zip 파일과 동일한 문제, SQL 파일 이름은 예측할 수 없으므로 잠그기가 어렵습니다. 따라서 여기에서 SQL 파일을 찾는 데 와일드카드를 사용합니다). 폴더.
7단계, MySQL에 로그인하고 데이터베이스를 삭제합니다.
8. MySQL에 로그인하고 방금 삭제한 데이터베이스와 동일한 이름으로 데이터베이스를 다시 생성합니다.
9. MySQL에 로그인하고 이전에 이름을 바꾼 sql 파일을 가져옵니다.
열번째, 백업이 완료되었음을 알리는 임의의 텍스트 파일을 생성합니다.
bash -x를 사용하여 쉘 스크립트를 여러 번 테스트했는데 제대로 작동하는 것 같습니다. 실제로 .zip 파일이 어느 폴더에 있는지 신경 쓰지 않고 서버에 있는 모든 zip 파일의 압축을 풀고 싶어하는 것처럼 보이는 몇 가지 문제가 있습니다. 이는 좋지 않지만 핵심 문제는 crontab이 그렇지 않다는 것입니다. 일하지 마세요. 내 crontab 줄은 다음과 같습니다.
00 00 * * * /var/www/html/(actual filepath)/backups/backup_extract.sh
테스트하면서 계속 시간을 바꾸었는데, 대개는 그렇습니다.
확인해보니 /var/log/cron
스크립트를 실행한 것처럼 동작하지만 실제로는 아무 작업도 수행하지 않습니다.
나는 crontest.txt 파일을 생성하고 bash와 cron을 사용하여 테스트하는 간단한 crontest.sh 파일을 생성하려고 시도했습니다. bash는 잘 작동하지만 cron은 그렇지 않습니다.
답변1
crontab 파일은 어떻게 만들었나요? 루트가 아닌 사용자로 사용하는 경우 crontab -e
프로세스에는 트리를 수정할 수 있는 충분한 권한이 없습니다 /var/www
.
루트로 생성하면 $PATH가 설정되지 않아 호출이 mysql
실패할 수 있습니다.
파일 을 편집한 경우 /etc/crontab
필드가 누락되었습니다 username
.
4행에도 철자 오류가 있습니다. 여기서 목표는 다음과 같습니다./var/ww/...
답변2
내 솔루션은 사람마다 다를 수 있지만 기본적으로 crontab -e
전혀 작동하지 않습니다. 결국 편집을 해야 했습니다 /etc/crontab
.
PATH 변수를 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
/bin/bash로 SHELL을 설정하고 해당 파일에 내 cron 작업을 추가합니다. 이제 cron 작업이 올바르게 실행됩니다.
왜 작동하지 않는지 잘 모르겠습니다 crontab -e
. 경험이 많은 사람이 몇 가지 가능한 이유를 제시할 수 있다고 확신하지만 전혀 모르겠습니다.