データベースをバックアップするスクリプトを書きました。直接実行すると動作します。私はそれをcronジョブにしようとしましたが、実行中(service status cron
で確認しました)、静かに失敗したようです。
スクリプトは次のとおりです。
#!/bin/bash
echo "Starting mongo backup"
mkdir /home/ubuntu/backups
docker exec -it mongodb mongodump --archive=/root/mongodump.gz --gzip
docker cp mongodb:/root/mongodump.gz /home/ubuntu/backups/mongodump_$(date +%Y-%m-%d_%H-%M-%S).gz
echo "Mongo dump complete"
printf "[default]\naccess_key=\nsecret_key=\nsecurity_token=\n" > ~/.s3cfg
s3cmd put /home/ubuntu/backups/* s3://my-backup-bucket/
echo "Copy to S3 complete"
rm /home/ubuntu/backups/* -r
echo "Files cleaned"
絶対パスのみを使用しました(EDIT:ええ、実際にはしませんでした)、環境変数なし、エスケープなし%なし。何を逃したのかわかりません。
考えられる理由の1つは、コマンドへの絶対パスを使用せず、一部のコマンドがデフォルトでCronの/usr/bin
envvarに属する/bin
または$PATH
にないことです。
コマンドwhich
により、コマンドの各実行可能ファイルの場所を確認できます(例:which s3cmd
)。その後、スクリプトにコマンドとその絶対パスを配置できます。
別の方法は、スクリプトまたはcrontab
で$PATH
に新しい値を割り当てることです。 なぜcrontabスクリプトが機能しないのですか?
Cronjobの出力をファイルにリダイレクトして、問題のある場所をデバッグできます。このため、次のようにジョブを変更します。
* * * * * /path/to/the-script >/path/to/log-file 2>&1
さらに、スクリプト内で$HOME
の代わりに~
を使用することを好みます。