Cron/ja

このガイドでは、Gentoo Linuxにおけるcronデーモンのセットアップと利用方法を説明します.

cronとは何か
cronはcrontabコマンドからの入力に基づいてスケジュールされたタスクを起動するためのデーモンです. cronは１分毎に起床し、ユーザのcrontabに実行すべきcronジョブがあるかどうかチェックします.

デファクトのcron
Portageにはいくつかのcron実装があります. これらはすべてよく似たインタフェースを持っていて、crontabもしくはそれに類似したコマンドを使用します. また、連続稼働しないシステムのcronと協調して動作するanacronと呼ばれる関連ユーティリティもあります.

また、現在利用可能な全てのcronパッケージがに依存していることは強調すべきです. 技術的には、どのcronパッケージもこのパッケージに依存していません. しかし、このパッケージは大部分のユーザに有益でcronに似た機能を提供します.

cronを動作させる前に、適切なcron実装が選択されていなければなりません. このガイドでは、Gentoo Linuxで利用可能なcron実装を説明します.

vixie-cron
vixie-cronは、SysV cronベースで全ての機能を実装したcronです. ユーザ毎にcrontabを持ち、その中で環境変数を指定することが可能です. その他のcronと異なり、vixie-cronはSELinuxとPAMをサポートしています. サポートするアーキテクチャはdcronよりは少ないですが、fcronよりは多いです.

の特徴


 * SELinuxのサポート
 * PAMのサポート
 * crontabで環境変数を設定可 (PATH、SHELL、HOME等)
 * ユーザ独自のcrontabを持つことが可能. とによるアクセス制御.

cronie
cronie はvixie-cron のフォークで、Fedora で開発されました. このためcronieはオリジナルのvixie-cronと同じ特徴を持ちます. さらに、cronieは anacronの機能も実装しています. この機能を利用するには USEフラグを有効にする必要があります.

dcron (Dillonのcron)
dcronはシンプル、エレガント、かつセキュアな実装を目指しています. crontabでの環境変数の設定はできません. すべてのcronジョブをから実行します. vixie-cronと同じように、それぞれのユーザがそれぞれのcrontabを持つことができます.

の特徴


 * 高速、単純、不要な仕様がない.
 * crontab へのアクセスを、例えばcronグループに所属するユーザだけに制限することができる. つまり、外部機能に依存しない.

fcron
fcronはvixie-cronとanacronの置き換えを意図しています. 連続稼働しないシステムで動作できるよう設計されていて、いくつかの拡張機能を持っています. それは「ジョブがスタートするための条件設定」、「ジョブのシリアライゼーション制御」、「ジョブにnice値を付与する機能」、「システム起動時に動作するジョブのスケジュール」です. さらに詳細な情報についてはfcron's home pageを参照してください.

の特徴


 * 連続稼働しないシステムで動作するように設計されています. つまり、システム停止中のため動作できなかったジョブを再起動後に実行できます.
 * 環境変数やその他多くのオプションをcrontabで設定できます.
 * 多くの新機能と共に、拡張されたcrontab記述をサポートします.
 * 各ユーザーはとでアクセス制御可能なcrontabを持つことができます.

bcron
bronはセキュアなオペレーションを念頭に置いて設計された新しいcronシステムです. これを実現するため、cronシステムはいくつかのプログラムに分割され、それぞれが別のタスクに対して責任を持つことになりました. また、それらタスク間のコミュニケーションは厳格に制御されました. ユーザインターフェースは、よく似たシステム（例 vixie-cron）の単純な置き換えですが、内部の実装は大きく異なっています. より詳細な情報についてはbcronのホームページhttp://untroubled.org/bcronを参照してください.

の特徴


 * vixie-cronの単純置き換え
 * マルチプロセス設計
 * 地域毎の夏時間サポート

anacron
anacronはcronデーモンそのものではなく、cronデーモンと組み合わせて動作します. anacronは指定された間隔でコマンドを実行し、システムが連続的に稼働することを前提とせず、シャットダウンのために実行されなかったジョブをリブート後に改めて実行します. 通常、anacronは毎日動作するcronデーモンに依存しています.

インストール
目的にあった適切なcronを選択し、emergeしてください.

選択されたcronデーモンがシステムのinitプロセスに追加されたことを確認してください. 追加されていない場合、cronデーモンはジョブを開始しません.

オプションとして、cronデーモンのヘルパーとしてanacronをインストールすることは良い選択です. ただしfcronがインストールされていないことが条件です.

anacronをインストールした場合は、anacronをシステムのinitプロセスに確実に加えてください.

システムcrontab
cronパッケージのインストール時のメッセージでcrontab /etc/crontabを実行するよう促されるでしょう. このファイルはシステムcrontabと呼ばれています. cronはに記載されたスクリプトを実行するために、システムcrontabとを使用します. ここで、vixie-cronとcronieだけがに記述するだけで自動的にジョブを実行することに留意してください. 一方、dcronとfcronはを変更するたびにcrontab /etc/crontabを実行する必要があります.

さらに、システムcrontabで予約されたジョブは、crontab -lで示されるcronジョブのリストにおそらく現れないことを注記しておきます.

もちろんシステムcrontabをまったく使用しない選択をすることも可能です. dcronもしくはfcronの場合、crontab /etc/crontabを実行してはいけません. vixie-cron、cronie、bcronの場合はの全ての行をコメントアウトして下さい.

sedコマンドでファイルの全ての行をすばやく簡単にコメントアウトできます. に対して次のコマンドを実行してください.

信頼できるユーザーにcronへのアクセス権を与える
root以外でcronデーモンにアクセスする場合は、このセクションが参考になるでしょう. そうでない場合は次のセクションScheduling cron-jobsに進んで下さい.

選択したcronパッケージに関わらず、あるユーザーにcrontabへのアクセスを許可する場合、そのユーザはcronグループに所属しなければなりません. 例として、次のコマンドはユーザ"wepy"をcronグループに追加します.

dcronを使用する場合、上記の手順だけでユーザーはcrontabにアクセスできるようになります. dcronユーザは次のセクションScheduling cron-jobsに進んでください. その他のユーザーはこのまま本ガイドを読み進めてください.

fcronの場合はとを編集します. 最もシステムを安全に保つ方法は、最初にで全てのユーザーを拒否して、次に明らかに許可したいユーザーのみで許可することです.

もし、あるユーザー（ここで再度wepyを例に使います）が独自のcronジョブをスケジュールしなければならない場合、次をに追加してください.

vixie-cronかcronieが選択された場合は、単にを編集します.

例として、ユーザー"wepy"にアクセス権を与える場合、以下のようにに追加してください.

cronジョブのスケジューリング
crontabの編集方法はcronパッケージ毎に異なります. しかしそれらすべては同じ基本コマンド群をサポートしています. このコマンド群を用いて、crontabを編集したり、消去したり、crontab中のジョブをリストアップしたりといったことを実行します. 次のリストはそれぞれのパッケージ毎にどのようにコマンドを実行するかを示しています.

これらのコマンドを実施する前に、crontabそのものを理解することがまず必要です. crontab中のそれぞれの行は、次の順序で５つのフィードを持ちます. 分（0～59）、時間（0～23）、日（1～31）、月（1～12）、曜日（0～7、月曜日が1で日曜日が0もしくは7）. ここで曜日と月は3文字の略称で表すこともできます. 例えばmon、tue、jan、feb等です. それぞれのフィールドは範囲で表すこともできます. 例えば1-5やmon-friといった記述です. カンマで分離された記述（例：1,2,3やmon,tue,wed）や刻み幅を使った範囲指定（例：1-6/2は1と3と5を示します）も可能です.

少し混乱するかもしれませんが、いくつかの記述例を見ればそれほど複雑でないことがわかるでしょう.

何がカバーされているかをテストするために、少ないcronジョブを与えて何が起こるかを確認しましょう. 最初に次のファイルを作成します.

このcrontabファイルを上の表の"crontab新規作成"のコマンドを使って登録しましょう.

スケジュールされたcronジョブを検証するため、上の表の"cronジョブの表示 "に記載されているコマンドを使用します.

とよく似たリストが得られるはずです. 表示されない場合は、おそらく適切でないコマンドをcrontabに与えたのでしょう.

このcrontabは2ヶ月毎に、毎日、毎時間、毎分"I really like cron"を出力するはずです. 明らかにユーザはcronが気に入ったときにそれをするのでしょう. このcrontabは、1月と2月の毎日16:30に"I like cron a little"を出力します. また1月1日の3:10に"I don't really like cron"を出力します.

もしanacronを使っている場合は、このままガイドを読み続けてください. もし使っていない場合は、次のセクションEditing crontabsに進んでください.

anacronユーザはを編集します. このファイルは4つのフィードを持っています. それぞれ「何日毎に実行するか」、「anacron実行の何分後にジョブを実行するか」、「ジョブの名前」、「ジョブの実行コマンド」となります.

例えば"I like anacron"を、5日毎に、かつanacronがスタートしてから10分後に出力したい場合、次を入力してください.

anacronは、anacrontabファイルに記載のすべてのジョブを完了後、exitします. これらのジョブが毎日実行されているかどうかを確認するために、cronデーモンが使用されます. 次のセクションの最後に、これがどのように扱われるかを記載します.

crontabの編集
現実的に、cronが毎分毎に、どれぐらいcronが好きか逐一報告されることを希望するユーザーはいないでしょう. 次のステップとして、上記の表の消去コマンドに相当するものを使用して、これまで使用したサンプルのcrontabを消去しましょう. 消去した後はリストコマンドを使用して、cronジョブがすでに動作していないことを確認しましょう.

crontab -lでcronジョブは出力されないはずです. もしcronジョブが残っている場合、crontabの消去が失敗しています. その場合はシステムのcronパッケージに合致した消去コマンドを使用してるかどうか確認してください.

これでクリーンな状態になりました. 何か役に立つものをroot crontabに追加しましょう. 多くの場合、mlocateを正しく動作させるために週単位でupdatedb</tt>を動かすでしょう. システムのcrontabに追加する場合、以下のようにを変更します.

この例では、cronは毎週月曜日の午前2:22にupdatedbを起動します. 適切な新規作成コマンドを上の表から選択、実行してください. 実行後、もう一度リストをチェックしましょう.

これでようやくPortageツリーを最新の状態に保つためにemerge --sync</tt>を日々スケジュールすべきと主張できます. これはを編集し、上の例で示したようにcrontab crons.cron</tt>を実行する、もしくは上の表で示される適切な編集コマンドでスケジュールできます. この方法で、等の外部ファイルに依存せずに、ユーザーのcrontabを今の場所で編集することができます.

このコマンドはユーザーのcrontabをエディターで開きます. 例えば、emerge --sync</tt>を毎日午前6:30に実行したい場合、crontabを以下のようにしてください.

ジョブがスケジュールされたことを今一度確認するため、前述の例のようにcronジョブのリストを確認してください. もし期待しているものが全て表示された場合、システムはロックンロールの準備完了です.

cronbaseを使う
最初に述べたように、すべてのcronパッケージはに依存しています. このcronbaseパッケージはと、と呼ばれるスクリプトを生成します. デフォルトのは以下のようになっていることに注意してください.

詳細に立ち入るのはやめて、これらのコマンドは毎時、毎日、毎週、毎月スクリプトを効果的に実行するとしましょう. cronジョブをスケジューリングするためのこの方法にはいくつかの重要なメリットがあります.


 * これらのジョブがスケジュールされているときにコンピューターがオフになっても、ジョブは実行されます.
 * パッケージのメンテナーにとって、明確に定義された場所にスクリプトを設置することは容易です.
 * 管理者はcronジョブとcrontabがどこに保存されているか、正確に知ることが可能です. これにより、これらシステム部品のバックアップおよびリストアが簡単になります.

anacronを使う
先に記述したとおり、anacronは（ほとんどのデスクトップインストールがそうであるように）連続稼働しないシステムで使用されます. anacronのデフォルトの設定ファイルはであり、通常は以下のようになります.

この設定ファイルと、他の一般的なcrontabとの違いは、anacronではジョブをスケジュールするにあたり、ランとランの間の時間以外に、固定した日時を指定しないことです. anacronを起動したとき、anacronはの内容をチェックして、最後のランから期限が切れたエントリーがないかどうか計算します. もしこのようなエントリが存在した場合、そのコマンドは再度起動されます.

最後に、システムにインストールされた他のcronとオーバーラップするエントリはコメントアウトしなければなりません. 例えば以下のvixie-cronのcrontabはその例です.

これをしない場合、日、週、月の部分は、cronデーモンとanacronによって異なる時間に実行されます. これにより二重にジョブが実行されます.

最後に
cronパッケージはそれぞれ異なり、機能的にも大きな幅を持っていることを覚えておいてください. 使用しているcronデーモンにあわせて、crontab、fcrontab、anacrontab等のmanページをよく理解しましょう.

Good luck!

トラブルシューティング
cronが正しく動作しない場合、以下のチェックリストが役に立つかもしれません.

cronは起動していますか?
cronが起動しているかどうかを検証するため、cronがプロセスリストに存在しているかどうかを確認してください.

cronは動作していますか?
次を試してみてください.

上記を実施後、が定期的に更新されているか確認してください.

そのコマンドは動作していますか?
上記と同様に、標準エラー出力もリダイレクトしてみましょう.

cronはジョブを起動していますか?
cronのログを確認してください. 通常、エラーはもしくはに記録されます.

はありますか？
通常、cronは何か問題が発生した際にメールを送付します. メールが届いていないか、もしくはが生成されていないか確認してください.

cronの代替
いくつかのホスティング会社はcronへのアクセスを許可していません. ただし、有償、無償を問わず、多くのcron代替をみつけられるでしょう.


 * EasyCron