web-dev-qa-db-ja.com

作業スクリプトがcronジョブとして実行されないのはなぜですか?

データベースをバックアップするスクリプトを書きました。直接実行すると動作します。私はそれを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:ええ、実際にはしませんでした)、環境変数なし、エスケープなし%なし。何を逃したのかわかりません。

5
Billybobbonnet

考えられる理由の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の代わりに~を使用することを好みます。

4
pa4080