
毎晩データベースのダンプを作成する crontab があります:
20 3 * * * /path/to/dailydump.sh
dailydump.sh
含まれるもの:
#!/bin/sh
DATENAME=`date +%Y%m%d`
BASENAME="/path/to/dumps/db_${DATENAME}.sql"
/usr/bin/mysqldump -hhost -uusername -ppassword databasename > ${BASENAME}
権限は次のとおりです:
-rwx---r-x 1 ... dailydump.sh
drwxr-xrwx 2 ... dumps
なぜ cronjob が動作しないのでしょうか?
私はルートアクセスのない共有サーバーを使用しています。/var/log/cron
または にはログインがありません。またはに/var/log/syslog
はメールがありません(実際、 と には何もありません) 。エラーメッセージもメールされず、ログファイルも保存されません。は何も返しません。 (/var/mail/<user_name>
/var/spool/mail/<user_name>
/var/mail/
/var/spool/
[email protected]
1 2 * * * /path/to/your/command &>/path/to/mycommand.log
ps -ef | grep cron | grep -v grep?
https://serverfault.com/a/449652)
すべてのファイルを新しいドメインに移動し、新しい crontab を設定するまで、セットアップ全体は正常に動作していました。(はい、すべてのパスとデータベースのログイン情報を更新しました。複数回確認もしました。) 同じマシンで同じホスティング プロバイダーを使用しているため、環境は変更されていません。
ご協力いただければ幸いです。
"解決"
そうですね、これはとても奇妙です。私のプロバイダーのヘルプ センターには、cronjob によって実行されるスクリプトがパスワードで保護されたディレクトリ内にある場合、-auth=user:password -source
スクリプトへのパスの前に を追加する必要があると書かれています。そこで、(適切な認証を使用して) 以下を追加しました。
20 3 * * * -auth=user:password -source /path/to/dailydump.sh
その結果、エラーメッセージがメールで送られてきました(それでうまくMAILTO=
いきます)、利用可能なオプションをリストして教えてくれました/bin/sh: -=: invalid option
。ヘルプセンターの例では、実際には物理パス(/path/to/file
)ではなくURL( )が示されていたので、もう一度http://...
削除してcrontabを保存し、auth
source
今、f%§#ing cronjobが実行されます!!'crontab は文字単位では以前とまったく同じように見えますが、コードに明らかな変更がなくても実行されるようになりました。
何が問題だったのか分かりませんが、間違ったコードを挿入して再度削除するとうまくいきました。o_O cronjobが実際にはした常に実行される(実行されない場合、明らかにエラーが発生するため)が、何もしませんでした!とても不思議です。もし誰かが私にそれを(再現可能な方法で)説明できるなら、私は 200 の賞金を出してそれを授与します(必要な 2 日間の待機後)。
また、@chaos は、シェル スクリプトを完全に回避し、cron でデータベースを直接ダンプするという別の解決策を教えてくれました (以下の彼の回答へのコメントを参照してください)。
20 3 * * * /usr/bin/mysqldump -hhost -uusername -ppassword databasename > /path/to/dumps/db_$(date +\%Y\%m\%d).sql
パーセント記号をエスケープすることを忘れないでください。そうしないと、スクリプトは「予期しない EOF」を検出します。
皆さんのご協力に感謝します。また多くのことを学びました(ただし、ここで何が間違っていたのかはわかりません)。
答え1
cron
デーモンが実行中で、 を尊重していることを確認するにはcrontab
、小さなテストを行うことができます。 をcrontab
次のようなエントリで編集します。
* * * * * /bin/date >>/tmp/test
1 分後に /tmp/test ファイルを確認してください。ファイルがない場合、デーモンはおそらく実行されていません。その場合は、プロバイダーのサポートに連絡してください。
編集:
cron インスタンス内の環境を決定するには、次の操作を行います。
* * * * * /usr/bin/id >>/tmp/test
* * * * * /usr/bin/env >>/tmp/test
次にファイルの内容を確認します。
答え2
- スクリプトを直接実行し、動作するかどうかを確認します。
- スクリプトの設定方法によっては、スクリプトが crontab で実行されているときに、一部のシェル環境変数が使用できない場合があります。
スクリプトを変更して、環境変数に問題があるかどうかをテストしてみてください。
sh --login -c "/usr/bin/mysqldump -hhost -uusername -ppassword databasename > ${BASENAME} > /path/to/LogFile.txt 2>&1"