cronjob がシェル スクリプトを実行しないのはなぜですか?

cronjob がシェル スクリプトを実行しないのはなぜですか?

毎晩データベースのダンプを作成する 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.logps -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を保存し、authsource今、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

  1. スクリプトを直接実行し、動作するかどうかを確認します。
  2. スクリプトの設定方法によっては、スクリプトが crontab で実行されているときに、一部のシェル環境変数が使用できない場合があります。

スクリプトを変更して、環境変数に問題があるかどうかをテストしてみてください。

sh --login -c "/usr/bin/mysqldump -hhost -uusername -ppassword databasename > ${BASENAME} >  /path/to/LogFile.txt 2>&1"

関連情報