私はデフォルトでzipファイルを解凍し、データベースを削除し、同じ名前のデータベースを作成し、zipファイルから生成されたsqlファイルを取得するbackup_extract.shという比較的短いシェルスクリプトを設定しようとしています。
zipファイルは別々のサーバーに作成され、毎日そのサーバーに送信されます。これはWordPressサイトの単純なデータベースバックアップであり、スクリプトはWordPressサイトの1:1レプリカで新しいサーバーのデータベースを復元するように設計されています。サーバーはバックアップ目的で別のWebサイトを使用しています。
私が経験している問題は、スクリプトを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コマンドがどのようなことをするのかわかりませんが、もしケースに備えています。私が必要ない場合。
2番目のディレクトリは現在の日付を使用して作成されます。
第三に、作成したフォルダにzipファイルを抽出します。ここでは状況が複雑になります。毎日新しいzipファイルがこのフォルダに移動されますが、名前は他のサーバーでプログラム的に生成され、zipファイルの名前を正確に予測できないため、そのフォルダ内のすべてのzipファイルを解凍する方法が必要です。このフォルダ - 解凍すると移動されるため、複数のzipファイルを一度に解凍することを心配する必要はありません。
第四に、2行目で作成したフォルダにzipファイルが移動されます。
第五に、zipファイルから抽出したフォルダにCDを挿入します。
第6に、ここにあるすべてのSQLファイルの名前をより予測可能な名前に変更します(zipファイルと同じ問題、SQLファイル名は予測不可能なのでロックするのは難しいので、ここでSQLファイルを見つけるためにワイルドカードを使用します) 。フォルダ。
ステップ7、MySQLにログインしてデータベースを削除します。
8. MySQLにログインし、削除したばかりのデータベースと同じ名前でデータベースを再作成します。
9. MySQLにログインし、以前に名前を変更したsqlファイルをインポートします。
10番目に、バックアップが完了したことを知らせる任意のテキストファイルを作成します。
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ファイルはどのように作成しましたか? root以外のユーザーとして使用している場合、crontab -e
プロセスにはツリーを変更するのに十分な権限がありません/var/www
。
ルートとして作成すると、$ PATHが設定されず、呼び出しが失敗する可能性mysql
があります。
ファイルを編集した場合、/etc/crontab
フィールドがありませんusername
。
4行目にもスペルエラーがあります。ここでの目標は次のとおりです。/var/ww/...