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 aims to be a simple, elegant and secure implementation of cron. It does not allow the specification of environment variables in crontabs and all cron-jobs are run from. Like vixie-cron, each user has his own 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"にアクセス権を与える場合、に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を使っている場合は、このままこのセクションを読み続けてください. もしanacronを使っていない場合は、次のセクションEditing crontabsに進んでください.

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

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

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

crontabの編集
現実的に、ユーザーがどれぐらい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ジョブのリストを確認してください. もし期待しているものが全て表示された場合、ロックンロールの準備OKです.

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

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


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

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

anacrontabと他の一般的な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