Gentoo Linux Cronガイド
1.
cronの基礎概念
cronは何をするのか
cronはcrontabコマンドからの入力に基づいて、定期作業を実行するデーモンです。
これは1分ごとに、各ユーザのcrontabになにか実行されるべきcronジョブがあるかどうかが確認されることで行われています。
注意:
crontabは、cronジョブの登録情報の一覧名でもあり、そのリストを編集するコマンド名でもあるということに気をつけてください。
|
事実上標準のcron
Portageには選択可能なcronの実装がいくつかあります。
これらは同じようなインターフェースを提供します。すなわちcrontabかそれに似たコマンドを使います。
連続運用されないシステムでcronと共に動作するAnacronという関連したユーティリティもあります。
これら利用可能なcronパッケージのすべてがsys-process/cronbaseに依存していると知っておくべきです。
いずれのcronパッケージもこのパッケージに対しては技術的に依存しているわけではありませんが、このパッケージは多くのユーザにとって便利なcronに似た機能を提供します。
cronを使い始める前に、どの実装を使用したいか選ばなければなりません。
参考までに、以下にこれらそれぞれの情報を集めました。
2.
どのcronが適切でしょうか?
vixie cron
vixie cronはSysV cronに準じた完全なcron機能を実装しています。
ユーザは各自のcrontabを所有しており、crontabで環境変数を指定することができます。
他のcronと違い、SELinuxとPAMのサポートも提供します。
アーキテクチャのサポートは、dcronより少ないですが、fcronよりは多いです。
sys-process/vixie-cronには以下のような特徴があります。
- SELinuxのサポート
- PAMのサポート(/etc/security/limits.conf)
- crontabに環境変数(PATH、SHELL、HOMEなど)を設定可能
-
ユーザが各自のcrontabを持つことができ、その利用の可否はcron.allowとcron.denyで制御可能
Dillonのcron
dcronはシンプル、かつ洗練され、そして安全性の高いcronの実装を目指しています。
crontabで環境変数を指定することはできず、全てのcronジョブは/bin/shから実行されます。
vixie cronと同様に、それぞれのユーザが各自のcrontabを持ちます。
sys-process/dcronには以下のような特徴があります。
- 高速に動作し、構造が簡単で、無用な機能がありません
-
crontabへのアクセスはcronグループに制限され、従って、外部の機能には依存しません
fcron
fcronはvixie cronとanacronの代わりになることを目指しています。
連続運用しないシステムで動作するように設計されており、追加の拡張機能が詰め込まれています。
これにはジョブの起動条件、ジョブの実行順序の制御、ジョブに(実行優先度を決める)nice値を割り当てる機能、システムの起動時にジョブを実行することができるスケジュール機能があります。
より詳しい情報はfcron's home pageを参照してください。
sys-process/fcronには以下のような特徴があります。
-
連続運用しないシステムで動作するように設計されています。すなわち、それは実行に失敗したジョブがあれば再起動後に実行します
-
crontabで環境変数やその他多くのオプションが設定可能
-
ユーザが各自のcrontabを持つことができ、その利用の可否はcron.allowとcron.denyで制御可能
-
多くの新しい機能をサポートする拡張されたcrontab構文を利用可能
bcron
bcronはセキュアな動作を念頭において設計された新しいcronです。
このために、システムは分割されたタスクに対応する複数のプログラムに分割され、互いの通信は厳密に制御されています。ユーザーインタフェースは互換性のため同様のシステム(vixie-cronのような)と同じですが、内部的には大きくことなっています。
より詳しくは、bcronのホームページhttp://untroubled.org/bcron/
sys-process/bcronには以下のような特徴があります。
- vixie-cronとの互換
- マルチプロセス対応
- サマータイム対応
anacron
anacronはcronデーモンではなく、たいていcronデーモンと連携して動作するものです。
それは長い間、特定の間隔でコマンドを実行し、システムが連続稼働していることを想定していません。
それゆえ、システムがダウンしている間に失敗したジョブを実行します。
anacronはたいていいつも動作しているcronデーモンと連携します。
3.
cronを使う
インストール
最も好みのcronを選んだら、それをemergeします。
コード表示 3.1: cronのインストール |
# emerge dcron
# /etc/init.d/dcron start
# rc-update add dcron default
|
お好みですが、もしFcronをインストールしたのでないのなら、Anacronをインストールしてもよいです。
コード表示 3.2: anacronのインストール |
# emerge anacron
# /etc/init.d/anacron start
# rc-update add anacron default
|
システムcrontab
これらcronパッケージをインストールした後に、crontab /etc/crontabを実行するように指示されます。
/etc/crontabファイルがあなたのシステムcrontabです。
cronのインストールは、/etc/cron.{daily,hourly,weekly,monthly}でスクリプトを実行するために、sys-process/cronbaseとともにシステムcronを使います。
vixie-cronのみ、/etc/crontabに記述されている内容を、変更後すぐに反映することに注意してください。
dcronとfcronユーザは/etc/crontabを変更するたびに、crontab /etc/crontabを実行する必要があります。
システムcrontabに登録されたジョブはcrontab -lを使って表示されるcronジョブリストには表示されないことに注意してください。
もちろん、どんなシステムcrontabも全く使わないという選択もできます。
その場合は、dcronかfcronを選んだなら、crontab /etc/crontabを実行してはいけません。
また、vixie-cronかbcronを選んだなら、/etc/crontabの全ての行をコメントアウトするべきです。
コード表示 3.3: /etc/crontabの全ての行をコメントアウト |
# sed -i -e "s/^/#/" /etc/crontab
|
信用できるユーザにcronの利用を許可する
root以外のユーザをcronデーモンにアクセスできるようにしたいなら、この章を読んでください。
そうでなければ、次の章であるcronジョブの登録に進みましょう。
注意:
他のユーザにcrontabの利用を許可するということは、cronジョブをrootとして実行できるようにすることではありません。
ユーザがrootのcrontabを編集できるようにしたいなら、sudoを検討すべきです。
詳細はGentoo Sudo(ers) Guide(日本語訳)を参照してください。
|
どのcronパッケージを使うにしろ、ユーザにcrontabの利用を許可したいなら、まずユーザをcronグループに追加しなければなりません。
例では、wepyというユーザをcronグループに追加します。
コード表示 3.4: cronグループにユーザを追加 |
#gpasswd -a wepy cron
|
注意:
ユーザをcronグループに追加するときには、ユーザは確実にログアウトしておき、グループの変更が行われたら戻ってきてください。
|
dcronを使っているなら、ユーザにcrontabへのアクセス権を与えるだけです。
dcronユーザは次の章であるcronジョブの登録に進んでもかまいません。
その他のユーザはこのまま読み続けてください。
fcronを使っているなら、/etc/fcron/fcron.denyと/etc/fcron/fcron.allowを編集してください。
最も安全な方法は、まず/etc/fcron/fcron.denyで全てを拒否し、/etc/fcron/fcron.allowで許可するユーザを明示的に記述します。
重要:
/etc/fcron/fcron.allowと/etc/fcron/fcron.denyのどちらも存在していなければ、cronグループの全てのユーザは、crontabを利用することが許可されます。
fcronをインストールした時点での初期設定であるfcron.allowは、fcrontabの利用をcronグループに属する全てのユーザに許可します。
|
コード表示 3.5: fcron.denyの禁止設定 |
all
|
現在、cronジョブを登録可能であるべきwepyというユーザがいます。
以下のようにして/etc/fcron/fcron.allowに追加しましょう。
コード表示 3.6: fcron.allowの許可設定 |
wepy
|
vixie cronを選択した場合、おそらく/etc/cron.allowをだけ編集すればよいでしょう。
重要:
/etc/cron.allowだけが存在するなら、そこに記入されていてcronグループに属するユーザのみが利用できます。
ですが、空の/etc/cron.denyだけが存在するなら、全てのcronグループに属するユーザが許可されると言うことに注意することが重要です。
/etc/cron.allowがないなら、空の/etc/cron.denyを残したままにしてはいけません。
|
例えば、wepyユーザのアクセスを許可したいなら、以下のようにして/etc/cron.allowに追加します。
コード表示 3.7: /etc/cron.allowの許可設定 |
wepy
|
cronジョブの登録
crontabを編集する方法はそれぞれのパッケージによって異なりますが、それら全ては同じ基本的なコマンドをサポートしています。
それにはcrontabの追加、置き換え、編集、削除、そしてcronジョブの表示があります。
以下の表はそれぞれのパッケージでこれらのコマンドを実行する方法を示しています。
| パッケージの種類 |
crontabの編集 |
crontabの削除 |
新規crontab |
crontabの表示 |
| dcron |
crontab -e |
crontab -d [user] |
crontab file |
crontab -l |
| fcron |
fcrontab -e |
fcrontab -r [user] |
fcrontab file |
fcrontab -l |
| vixie-cron & bcron |
crontab -e |
crontab -r -u [user] |
crontab file |
crontab -l |
注意:
削除コマンドを使用する際に引数がなければ、現在のユーザのcrontabを削除します。
|
注意:
fcronはcrontabからfcrontabへのシンボリックリンクも作成します。
|
これらのコマンドを使う前に、crontab自身を理解する必要があります。
crontabのそれぞれの行は以下の5つの時間フィールドを指定する必要があります。
分(0-59)、時(0-23)、日(1-31)、月(1-12)、そして曜日(0-7、月曜日は1、日曜日は0と7)です。
曜日と月はmon、tue、jan、febなどといった3文字の略語で指定することも可能です。
それぞれのフィールドは数値の範囲(1-5やmon-friなど)や、数値をコンマで区切って指定(1,2,3やmon,tue,wedなど)、そして間隔を設定した範囲指定(1-6/2で1,3,5など)をすることもできます。
少々複雑に見えますが、以下の例を見れば、それほど難しい物ではないということが分かるでしょう。
コード表示 3.8: 例 |
* * * * * /bin/false
35 1 4 * mon-wed /bin/false
25 22 2 3 * /bin/true
0 2 * * 1-5/2 /bin/false
|
注意:
特定の曜日と日の指定を組み合わせる前に、どのように指定しなければならないか注意してください。
曜日か日のどちらか一方を*にした場合は、もう片方が優先されます。両方が*なら毎日を意味します。
|
今説明したことを確認するために、実際にいくつかのcronジョブを登録してみましょう。
まず、crons.cronというファイルを作成して以下のようにします。
コード表示 3.9: crons.cronの編集 |
$ nano crons.cron
10 3 1 1 * /bin/echo "I don't really like cron"
30 16 * 1,2 * /bin/echo "I like cron a little"
* * * 1-12/2 * /bin/echo "I really like cron"
|
ではcrontabを上記の表の「新規コマンド」を使ってシステムに追加しましょう。
コード表示 3.10: 新規crontab |
# crontab crons.cron
|
注意:
リダイレクトを使わない限りは実際にはechoコマンドからの出力は表示されないでしょう。
|
登録したcronジョブを確認するために、上記の表の適切な表示コマンドを利用します。
コード表示 3.11: cronジョブの表示 |
# crontab -l
|
crons.cronの内容と共通の表示がされているか確認すべきです。
確認できない場合、新規crontabを追加する際に間違ったコマンドを使ったのかもしれません。
このcrontabは1ヶ月おきの毎日毎時毎分に"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を使っているなら、このままこの章を読み続けてください。
使用していない場合は、次の章であるcrontabの編集に進んでください。
anacronユーザは/etc/anacrontabを編集します。
このファイルは4つのフィールドを持っています。
それは、実行間隔の日数、実行猶予時間の分数、ジョブ名、そして実行するコマンドです。
例えば、echo "I like anacron"を5日に1度、anacronの起動10分後に実行するなら、以下のようにします。
コード表示 3.12: /etc/anacrontab |
5 10 wasting-time /bin/echo "I like anacron"
|
anacrontabにある全てのジョブが実行された後、anacronは終了します。
したがって、これらのジョブを毎日確認したいなら、cronを使用する必要があります。
次章の最後でその方法を説明します。
crontabの編集
現実的に考えて、あなたがどれ程cronが好きかを1分ごとにシステムに伝える必要はないでしょう。
次へ進んで、上記表の使用しているcronパッケージに対応する削除コマンドを使用してcrontabを削除しましょう。
動作を確認するために、削除後にcronジョブを表示します。
コード表示 3.13: crontabの削除 |
# crontab -d
# crontab -l
|
crontab -lの出力には何のcronジョブも無いでしょう。
ジョブが表示されるなら、crontabの削除に失敗しています。
cronパッケージに合わせた正しい削除コマンドを実行したか確認すべきです。
ここまで問題なく進んできたので、rootのcrontabに何か役に立つことを入力しましょう。
多くの人はslocateが正しく動作するようにするために毎週updatedbを実行したほうがよいでしょう。
これをcrontabに追加するために、まず以下のようにcrons.cronを再度編集しましょう。
コード表示 3.14: 現実的なcrontab |
22 2 * * 1 /usr/bin/updatedb
|
これにより毎週月曜の朝2:22にcronがupdatedbを実行します。
では上記表の正しい新規コマンドを使ってcrontabを入力し、もう一度リストを表示して確認しましょう。
コード表示 3.15: cronジョブを表示 |
# crontab crons.cron
# crontab -l
|
ここで、毎日の日課としてemerge --syncを追加したほうがよいでしょう。
これを行うために、以前行ったようにまずcrons.cronを編集してcrontab crons.cronを使うか、上記表の正しい編集コマンドを利用することができます。
これはcrons.cronの様な外部ファイルに依存することなく、ユーザのcrontabを直接編集することができます。
コード表示 3.16: crontabの直接編集 |
# crontab -e
|
そうすると、エディタを使用してユーザのcrontabが開くはずです。
emerge --syncを毎日午前6:30に実行したいので、以下のように編集します。
コード表示 3.17: 実際のcrontab |
22 2 * * 1 /usr/bin/updatedb
30 6 * * * /usr/bin/emerge --sync
30 7 * * * /usr/sbin/anacron -s
|
繰り返しますが、ジョブが登録されているか確認するために、cronジョブリストを表示して確認します。
もし全てがあれば、設定は完了です。
4.
cronbaseの使用
前述の通り、利用可能なcronパッケージすべてがsys-process/cronbaseに依存しています。
cronbaseパッケージは/etc/cron.{hourly,daily,weekly,monthly}と、run-cronsというスクリプトを作成します。
デフォルトの/etc/crontabには以下のようなものが含まれていると気づくでしょう。
コード表示 4.1: デフォルトのシステムcrontab |
*/15 * * * * test -x /usr/sbin/run-crons && /usr/sbin/run-crons
0 * * * * rm -f /var/spool/cron/lastrun/cron.hourly
0 3 * * * rm -f /var/spool/cron/lastrun/cron.daily
15 4 * * 6 rm -f /var/spool/cron/lastrun/cron.weekly
30 5 1 * * rm -f /var/spool/cron/lastrun/cron.monthly
|
細部にはいるのを避けるために、これらのコマンドは毎時、毎日、毎週、そして毎月のスクリプトを実行すると仮定します。
cronジョブのスケジューリングを行うこの方法は、いくつかの重要な利点があります。
-
たとえスケジュールされた実行時間にコンピュータの電源が切れていたとしても実行されます
-
パッケージメンテナがスクリプトを定義された場所へ設置しやすくなります
-
cronジョブとcrontabがどこに保存されているかを正確に知ることが出来るため、バックアップとリストアを容易に行うことが出来ます
注意:
繰り返しますが、vixie cronとbcronは/etc/crontabを自動的に読み込むのに対し、dcronとfcronは行いません。
詳しくはSystem crontabの章を参照してください。
|
5.
最後に
トラブルシューティング
cronを正しく動作させるのに問題が発生しているなら、このクイックチェックリストをくまなく調べるといいでしょう。
-
cronは起動していますか?
ps ax | grep cronを実行して、表示されるか確認してください。
-
cronは動作していますか?
「* * * * * /bin/echo "foobar" >> /file_you_own」(訳注:file_you_ownには適当なファイルを指定してください。これ以降も同様にします。)をあなたのcronジョブに追加して、動作するか確認してください。
-
コマンドは動作していますか?
「* * * * * /bin/foobar > /file_you_own 2>&1」を追加して、「/file_you_own」のエラーを確認してください。
-
cronはあなたのジョブを実行できますか?
cronのログを確認してください。普通は/var/log/cron.logか/var/log/messagesにあります。
-
dead.letterはありますか?
cronは問題があるとたいていメールを送信するので、メールを確認し、~/dead.letterファイルも確認してください。
それぞれのcronパッケージは異なっており、機能の範囲は大きく異なっていると言うことを忘れないようにしてください。
使用するパッケージに応じて、crontab、fcrontab、anacrontabのmanページを必ず調べてください。
幸運を!
このドキュメントの内容は、他のものが明示されない限りは、
CC-BY-SA-2.5ライセンスです。
Gentoo Name and Logo Usage Guidelines (日本語訳)が適用されます。
|