この記事は(検証可能)な(参考文献や出典)が全く示されていないか、不十分です。(2021年9月) |
crontab
(クロンタブ、あるいはクローンタブ、クーロンタブとも)コマンドはUnix系オペレーティングシステム (OS) において、コマンドの定時実行のスケジュール管理を行うために用いられるコマンドである。標準入力からコマンド列を読み取り、crontabと呼ばれるファイルにそれを記録する。この記録を元に定時になると、その命令内容を読み取り、実行が行われる。cronという名称はギリシア語のクロノス (χρόνος) に由来するという説がある(Command Run ON の略という説も)。日本語ではクーロンという読みが慣習的に広く用いられているが、英語では通常クロンまたはクローンと発音する[1]。
一般にcrontab
コマンドで編集されたスケジュール内容は、crond
デーモンにより実行される。crond
はバックグラウンドで稼動し、毎分ごとに実行すべきスケジュールがないか確認し、もし実行すべきジョブがあれば、それを実行する。このジョブは「cron job」とも呼ばれる。
crontabファイル
crontabファイルには、ジョブのリストおよびcronデーモンへの命令が書かれる。各ユーザは自身の個人用crontabファイルを持つ。さらに、システム全体用のcrontabファイルも存在する(/etc またはそのサブディレクトリ下)。このシステム全体用のcrontabはシステム管理者のみが編集可能なものとなっている。
crontabファイルの各行は、空白またはタブで区切られたフィールド列から構成される特有の形式となっている。各フィールドには単一もしくは複数の値が書かれる。
特殊記号
一フィールド中で複数の値を指定するには、いくつかの方法がある:
- コンマ (,) で値のリストを指定する: 例) "1,3,4,7,8"
- ダッシュ (-) で値の範囲を指定する: 例) "1-6" ("1,2,3,4,5,6"という指定と同じ意味)
- アスタリスク (*) でそのフィールドで取りうる全ての値を表現する。例えば、時をあらわすフィールドでは「毎時」という意味となる。
cron実装によっては、いくつかの追加拡張をおこなっているものもある。スラッシュ (/) で一定値ごとの間隔を表現する: 例) 時フィールドでの"*/3"指定は"0,3,6,9,12,15,18,21"と同じ意を示す。つまり、"*"の場合は毎時をあらわすが、"/3"を指定すると、*で適用される値の範囲内における1番目・4番目・7番目...といった意を表す。
フィールド
# (行頭の # マークはコメント行を示す) # +------------ 分 (0 - 59) # | +---------- 時 (0 - 23) # | | +-------- 日 (1 - 31) # | | | +------ 月 (1 - 12) # | | | | +---- 曜日 (0 - 6) (日曜日=0) # | | | | | # * * * * * 実行されるコマンド
注:
- 「曜日」(第5フィールド)では0, 7の両方とも日曜日の意となる。
- 直感にあわないものの、「日」(第3フィールド)および「曜日」(第5フィールド)が同時に指定された場合、どちらかが満たされた場合両方でコマンドが実行される。以下の例も参照のこと。
第6フィールド以降の行の残りの箇所には実行すべきコマンドを指定する。
例
AIX システムにおけるadm ユーザのcrontabファイル
#================================================================= # SYSTEM ACTIVITY REPORTS # 平日・午前8時-午後5時の活動履歴は20分おき # 土曜日・日曜日の活動履歴は毎時 # 平日・午後6時-午前7時の活動履歴は毎時 # 平日 18:05 に概要報告を準備する #================================================================= 0,20,40 8-17 * * 1-5 /usr/lib/sa/sa1 1200 3 & 0 * * * 0,6 /usr/lib/sa/sa1 & 0 18-7 * * 1-5 /usr/lib/sa/sa1 & 5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 3600 -ubcwyaqvm &
よくあるミス
- 最もよく見られるミスの一つは、cron ジョブのテストの際に見られる。テストの際には、少なくとも2分以上先の時刻を実行時刻として指定する必要がある。これはcrontabファイルの再読み込みは、編集後の次の分時にのみ行われるためである。例えば、現在時刻が12:05である場合、crontabファイルの再読み込みが12:06:01に行われるため、次のジョブをスケジュールするには少なくとも12:07以降を指定する必要がある。これに対処してテストをすぐに行うには、cronサービス自体を再起動する方法もある。
- crontabからX Window Systemアプリケーションを起動するというミスも多く見受けられる。この問題は、cronからはX環境が実行可能かどうかが不明であり、crontabは主としてコンソールのみを対象としたプログラムの実行を意図しているためもあり、Xの情報を受け渡すことができない点にある。これに対応するには2つの方法がある。crontabの冒頭に
DISPLAY=:0.0
というような環境変数設定を行うか、アプリケーション実行引数に--display :0.0
オプションを付けるかである。:0.0 は一例であり、どのディスプレイに出力すべきかは、echo $DISPLAY
といったコマンドを実行して確認しておく必要がある。 - よくあるミスのひとつは、コマンド指定においてエスケープせずに「%」記号を使うことで、これはエスケープする必要がある。
# ミス: 1 2 3 4 5 touch ~/error_`date "+%Y%m%d"`.txt
この場合、デーモンからは右のようなエラーメッセージがメール送信される:「/bin/sh: unexpected EOF while looking for `」
以下のように修正すると良い
# エスケープしたもの: 1 2 3 4 5 touch ~/right_$(date +\%Y\%m\%d).txt
- 以下も別のよくあるミスのひとつである:
# 夏時間移行時に備える 59 1 1-7 4 0 /root/shift_my_times.sh
一見すると、上記は4月第一日曜日の午前1時59分にコマンドshift_my_times.shを実行するように見えるが、そうではなく、4月1日から4月7日までの毎日、および、4月中の日曜日全てで実行されてしまう。
これを書き直すとすれば、以下のようにするのが一つの方法である。
# 夏時間移行に備える 59 1 1-7 4 * test `date +\%w` = 0 && /root/shift_my_times.sh
- また、別のミスの例としては、2時間毎にジョブを実行しようとして、以下のように書くと、
# ログファイルに日付を追加 * 0,2,4,6,8,10,12,14,16,18,20,22 * * * date >> /var/log/date.log
これは、各偶数時に毎分実行されてしまう。
この意図を表現するには以下のようにする:
# 毎2時間おきに date コマンドを実行 0 0,2,4,6,8,10,12,14,16,18,20,22 * * * date >> /var/log/date.log
# もっと簡潔に書くと: 0 */2 * * * date >> /var/log/date.log
Emailの抑止
crontab により実行されたコマンドから出力が行われると、cron デーモンは通常その出力結果をユーザにメールで配送する。
- ある特定のコマンドの出力を抑止するには、その出力を
/dev/null
へのリダイレクトとすることでできる。crontab 経由の実行コマンド出力のメールを完全に止めるには、実行コマンド全てに、標準出力を/dev/null
にリダイレクトした上で標準エラー出力も標準出力へのリダイレクトとするような、以下のリダイレクトを加える。ただし、何らかのエラーが発生したとしても、何の出力も得られない。
>/dev/null 2>&1
- 現在広く使われている(Vixie cron)では、crontabファイルの冒頭に以下の記述を加えるだけで、全てのメール通知を止めることができる。
MAILTO=""
非標準の定義済みスケジューリング定義
一部のcron実装[2]では、以下のような非標準のマクロをサポートしている。
エントリー | 説明 | 同等の定義 |
---|---|---|
@yearly (or @annually) | 1年に1回、1月1日の真夜中に実行する | 0 0 1 1 * |
@monthly | 1ヶ月に1回、次の最初の日の真夜中に実行する | 0 0 1 * * |
@weekly | 1週間に1回、日曜日の真夜中に実行する | 0 0 * * 0 |
@daily (or @midnight) | 1日1回、真夜中に実行する | 0 0 * * * |
@hourly | 1時間に1回、1時間の初めに実行する | 0 * * * * |
@reboot | スタートアップ時に実行する | N/A |
@reboot
はデーモンが起動した時にジョブを1回だけ実行するように設定する。cronは通常は再起動しないため、これは通常マシンのブート時に対応する。@reboot
の動作はDebianで提供されるcronなどのいくつかの種類のcronで強制されるため、単純にデーモンを再起動しただけで@reboot
ジョブが再実行されることはない。
@reboot
は、特定のユーザー下でサーバーやデーモンを起動する必要がある場合や、ユーザーがプログラムを起動するためにinitを設定する権限がない場合に役に立つことがある。
crontabコマンド
ジョブのスケジュールを実際にcronデーモンに伝えるにはcrontabコマンドを使う。crontabファイル(例:example.crontab)を作成して、crontabコマンドの引数として指定する(crontab example.crontab
)。もしくは、引数無しで起動した上で、標準入力からコマンドを直接指定することもできる。
脚注
関連項目
外部リンク
- マニュアル
- Crontab : Scheduling Tasks
- Computer Hope Linux / UNIX の crontab コマンドの情報
- Opengroupの crontab 仕様 - 公式の (UNIX 03) 文書
- Crontab - Reference and Examples at mkaz.com
- crontab(1) man page(SunOS リファレンスマニュアル)
- crontab(1) man page(HP-UX リファレンス)
- ソフトウェア