0

データベースのバックアップを作成して S3 バケットにアップロードする次のスクリプトをオンラインで見つけました。

#!/bin/bash
# Shell script to backup MySql database

# CONFIG - Only edit the below lines to setup the script
# ===============================

MyUSER="test"           # USERNAME
MyPASS="test"       # PASSWORD
MyHOST="localhost"      # Hostname

S3Bucket="test" # S3 Bucket

# DO NOT BACKUP these databases
IGNORE="information_schema mysql performance_schema phpmyadmin"

# DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING
# ===============================

# Linux bin paths, change this if it can not be autodetected via which command
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
GZIP="$(which gzip)"

# Backup Dest directory, change this if you have someother location
DEST="/var/www/test/backup"

# Main directory where backup will be stored
MBD="$DEST/mysql-$(date +"%d-%m-%Y")"

# Get hostname
HOST="$(hostname)"

# Get data in dd-mm-yyyy format
NOW="$(date +"%d-%m-%Y")"

# File to store current backup file
FILE=""

# Store list of databases
DBS=""

[ ! -d $MBD ] && mkdir -p $MBD || :

# Get all database list first

if [ "$MyPASS" == "" ];
then
  DBS="$($MYSQL -u $MyUSER -h $MyHOST -Bse 'show databases')"
else
  DBS="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'show databases')"
fi

for db in $DBS
do
    skipdb=-1
    if [ "$IGNORE" != "" ];
    then
        for i in $IGNORE
        do
            [ "$db" == "$i" ] && skipdb=1 || :
        done
    fi

    if [ "$skipdb" == "-1" ] ; then
        FILE="$MBD/$db.$HOST.$NOW.gz"
        # dump database to file and gzip
        if [ "$MyPASS" == "" ]; then
          $MYSQLDUMP -u $MyUSER -h $MyHOST $db | $GZIP -9 > $FILE
        else
          $MYSQLDUMP -u $MyUSER -h $MyHOST -p$MyPASS $db | $GZIP -9 > $FILE
        fi
    fi
done

# copy mysql backup directory to S3
s3cmd sync -rv --skip-existing $MBD s3://$S3Bucket/

そのため、cron ジョブを追加して実行し、最初は手動で実行しました。すべて問題なく、バックアップが S3 バケットに表示されました。しかし、今日から手動で実行しようとすると、何十ものエラーが発生します。

/var/www/test/backup/backup.sh: 48: [: test: unexpected operator
/var/www/test/backup/backup.sh: 62: [: information_schema: unexpected operator
/var/www/test/backup/backup.sh: 62: [: information_schema: unexpected operator
/var/www/test/backup/backup.sh: 62: [: information_schema: unexpected operator
/var/www/test/backup/backup.sh: 62: [: information_schema: unexpected operator
/var/www/test/backup/backup.sh: 62: [: information_schema: unexpected operator
/var/www/test/backup/backup.sh: 66: [: -1: unexpected operator
/var/www/test/backup/backup.sh: 62: [: mysql: unexpected operator
/var/www/test/backup/backup.sh: 62: [: mysql: unexpected operator
/var/www/test/backup/backup.sh: 62: [: mysql: unexpected operator
/var/www/test/backup/backup.sh: 62: [: mysql: unexpected operator
/var/www/test/backup/backup.sh: 62: [: mysql: unexpected operator
/var/www/test/backup/backup.sh: 66: [: -1: unexpected operator

データベースのリストもmysqlの資格情報も受け入れないのと同じです。そして、私はそれらに触れていません。この理由は何でしょうか?スクリプトを再度アップロードしようとしましたが、まったく同じスクリプトで、通常のユーザーで実行しましsudo sh ./backup.shたが、すべて成功しませんでした。私は Amazon EC2 で Ubuntu を使用しているので、権限のある何かが原因でしょうか? (私はそれを exectutabe として設定しsudo chmod +x backup.sh、 chown 777 で試しましたが、すべて成功しませんでした。

私はシェルスクリプトの専門家ではないので、これは私を混乱させます。ターミナルの使い方は知っていますが、スクリプトがまったく変更されていないのになぜこれが起こるのかわかりません。

Cronコマンドは次のとおりです:0 10 * * * /var/www/magicpin/backup/backup.sh(with sudo crontab -e)、おそらく使用crontab -eしてcronをに変更する必要があります0 10 * * * sudo sh /var/www/magicpin/backup/backup.sh

前もって感謝します!

編集:スクリプトが初めて機能した理由を明確にするためです。元のスクリプトのようです (後で少し変更しましたが、ディレクトリのアクセス許可を変更する行がありました)。そのため、初めて実行したときは、ユーザー Ubuntu から ./backup.sh 経由で実行できました。次回は、アクセス許可が変更されたため、「アクセス許可が拒否されました」と表示されたので、shアクセス許可などの実験を開始しました。

4

1 に答える 1

5

あなたbashのスクリプトは問題ないようです。それはあなたがそれを呼び出す方法だと思います。shbash異なるシェルです。次のように実行してみてください。

sudo ./backup.sh

また

sudo bash ./backup.sh

それ以外の

sudo sh ./backup.sh
于 2013-07-18T10:36:31.903 に答える