crontab と /etc/cron.hourly,daily,weekly の使用の違い

crontab と /etc/cron.hourly,daily,weekly の使用の違い

Subversion リポジトリの svnsync バックアップを 1 時間ごとに実行するスケジュール スクリプトがあります。ルート crontab のエントリから問題なく実行していましたが、可視性を高めるために /etc/cron.hourly から実行することにしました (また、エンジニアの 1 人が「crontab -r」を「crontab の読み取り」と勘違いして誤って crontab を削除してしまったため ;-))

cron.hourly スクリプトの svnsync コマンドはすべて失敗し、SVN リポジトリの SSL 証明書を受け入れる必要があるというメッセージが表示されます (これは、ユーザーが SVN リポジトリに初めてアクセスしたときに対話形式で表示されるメッセージですが、証明書を受け入れると、このメッセージは再度表示されなくなります)。

したがって、スクリプトは、cron.hourly から実行された場合と、ルート crontab 経由で実行された場合とでは、異なるユーザー環境で実行されているように思われます。この違いを説明できる人はいますか?

更新: 私のディストリビューションについて言及すべきでした。私は CentOS 5.1 で anacron を使用しています。

更新 2: これまでの提案に感謝します。これは Subversion に関する質問になりつつあると思います。私は常に自分の環境をスクリプトにカプセル化しようとしていますが、ここでの問題は、cron.hourly からスクリプトを実行するときに SVN が SSL 証明書の受け入れを要求する原因となる環境の何が (または何が欠けているか) わからないことです。これは、run-parts スクリプトの実行方法に関係しているのではないかと思います。

答え1

'--config-dir' オプションを使用して、承認された証明書が見つかる場所を指定します (デフォルトでは ~/.subversion など)。

そうは言っても、フック/コミット後のスクリプトからsvnsyncを呼び出す方がよいことはほぼ間違いないと思います。他の場所で提案そうすれば、ミラーはマスターの 1 時間前の場所と同期するのではなく、常に同期されます。

答え2

Debian/Ubuntu システムでは、cron.daily|weekly|monthly はメインの crontab から開始されます。

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

また、crontabフラグメントを/etc/cron.d/に配置することもできることに注意してください。

ご覧のとおり、この環境に特別な点はありません。少なくとも Debian/Ubuntu では、すべてが root アカウントとして実行されます。

cron スクリプトを書くときは、スクリプトの最初に必ず PATH と使用するその他の環境変数を設定するので、どの環境でも正しく動作することが保証されます。

答え3

通常のシステム全体の crontab は特定のユーザーの crontab であり、 で使用されるユーザー名フィールドがあります/etc/crontab

スクリプトを/etc/cron.*(毎時、毎日、毎週、毎月)使用することrootは、ユーザー用に crontab を構成するよりクリーンで簡単な方法(一般的な構文エラーを防ぐ)であり、これはrun-partsディレクトリ内のスクリプトまたはプログラムを実行する によって処理されます。これらのルールはすべて、デフォルトでシステム全体の crontab で定義されているため(/etc/crontab)、同じものです。

cron ジョブが によって処理される場合run-parts、どのスクリプトが正確に実行されるかを(まだ実行せずに)次のように簡単にテストできるため、デバッグが容易になります。

sudo run-parts --report --test /etc/cron.daily

答え4

私の RHEL 5.1 システムでは、PATH 環境変数は /etc/crontab から設定されます。上部にあるものはすべて環境に入力されるものです。

cronを再起動すると、最初に実行されたとき(/etc/crontabまたはからの場合/var/spool/cron/$USER)、/var/log/cronに記録されます。それ以外の場合は、cron.hourlyが実行されたことだけが記録されます。

私のcrontabは次のように設定されています:

01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

次のような内容を /etc/cron.hourly に記述することができます。

env > /tmp/cron.env

次に、ファイルが届いたらそれを調べ、スクリプトを変更して(可能な場合)環境を適切に設定するか、crontab が呼び出す短いラッパー スクリプトを作成します。

関連情報