cron
![]() | この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。(2021年9月) |
![]() cronの使用例 | |
開発元 | AT&Tベル研究所 |
---|---|
初版 | 1975年5月 |
プログラミング 言語 | C言語 |
対応OS | Unix、Unix系、Plan 9、Inferno |
種別 | ジョブ管理システム |
cronは、Unix系オペレーティングシステムのジョブ管理ツールである。cronジョブ[1][2](コマンドまたはシェルスクリプト)を予約すると[3]、指定した日時または間隔でジョブを実行する[4]。cronは、主にシステムの管理・維持を自動化する目的で使用されるが、一定の間隔でファイルや電子メールをインターネットからダウンロードするなどの用途にも応用できる[5]。
cronは、反復的なタスクを予約するのに有用である。一度だけ実行するタスクの予約には、atコマンドを使用する。
名称は、「時間」を指すギリシア語の単語「chronos」に由来する[6]。
概要
cronの動作は、crontab(cron table)ファイルで指定する。crontabは、一定のスケジュールで定期的に実行するシェルコマンドを指定する設定ファイルである。crontabファイルには、ジョブの一覧と、その他のcronデーモンへの指示が記録される。ユーザーは自分のcrontabを作成することができ、通常それとは別に、管理者のみが編集できるシステム全体のcrontabファイルが/etc
またはそのサブディレクトリ(例: /etc/cron.d
)に存在する[7]。
各行は、次の形式でジョブを定義する。
# ┌───────────── 分(0〜59) # │ ┌───────────── 時(0〜23) # │ │ ┌───────────── 日(1〜31) # │ │ │ ┌───────────── 月(1〜12) # │ │ │ │ ┌───────────── 曜日(0〜6〈日〜土〉、一部のシステムでは7も日曜日) # │ │ │ │ │ # │ │ │ │ │ # * * * * * [予約するコマンド]
各行は、コマンドを実行するタイミングを指定する5つの欄に続いて、実行するシェルコマンドを記入するという形式を取る。
通常、日時指定欄がすべて現在の日時と一致する場合にジョブが実行されるが、日(3つ目の欄)と曜日(5つ目の欄)の両方が指定されている(*
ではない)場合、どちらかのみ一致する場合にもジョブが実行される[8]。
例えば、以下は、cronのユーザーのデフォルトのシェルがBourne shellの場合に、Apacheのエラーログを毎日深夜から1分経過後に消去するジョブである。
1 0 * * * printf "" > /var/log/apache/error_log
また、以下は、export_dump.shを毎週土曜日23時45分に実行するジョブである。
45 23 * * 6 /home/oracle/scripts/export_dump.sh
一部のシステムでは、*/n
を指定して、n日・時間・分ごとにジョブを実行することができる。また、コンマを使って複数の時間間隔を指定することもできる(例: 1,2,3
)。例えば、以下の行は、1時から3時55分まで5分ごと(1時0分、1時5分、1時10分、…3時55分)にコマンドラインに「hello world」を出力する。
*/5 1,2,3 * * * echo hello world
各ユーザーは、実際に設定ファイルが保存されている場所によらず、crontab -e
を呼び出して自分の設定ファイルを編集できる。
多くのLinuxディストリビューションにインストールされているポール・ヴィクシーのBSD版cron実装は、ジョブを実行するアカウントのユーザー名を指定する6番目の欄を追加する。これは、システムのcrontabでのみ許可され、各ユーザーが単独で設定するよう割り当てられたその他のファイルでは使用できない。また、WindowsのnnCronデーモンなど、6番目の欄をアカウントのユーザー名ではなく年の指定に使うものもある。
Amazon EventBridgeのcron実装では、0
を基底とせず、日曜日から土曜日まで1
〜7
で曜日を指定し、月の最初の平日や月末などを指定する追加の機能を持つ[9]。
非標準のマクロ
一部のcron実装[10]は、以下の非標準のマクロをサポートしている。
マクロ | 説明 | 等価の表現 |
---|---|---|
@yearly (@annually )
|
毎年1月1日の0時0分に実行 | 0 0 1 1 *
|
@monthly
|
毎月1日の0時0分に実行 | 0 0 1 * *
|
@weekly
|
毎週日曜日の0時0分に実行 | 0 0 * * 0
|
@daily (@midnight )
|
毎日0時0分に実行 | 0 0 * * *
|
@hourly
|
毎時0分に実行 | 0 * * * *
|
@reboot
|
起動時に実行 | N/A |
@reboot
を指定すると、デーモン起動時にジョブが1回実行される。cronは通常再起動されることがないため、これは通常マシンの起動時と一致する。Debian版のcronなど、一部の種類のcronはマシンの起動時にのみ実行するよう設計されており[11]、デーモンの再起動時には@reboot
のジョブが再実行されないようになっている。
@reboot
は、特定のユーザーでサーバーやデーモンを起動する必要があり、ユーザーがプログラムを起動するようinitを設定する権限がない場合に有用である。
cronのパーミッション
次の2つのファイルは重要な役割を担っている。
- /etc/cron.allow – このファイルが存在する場合、cronジョブを使用するにはユーザー名がこのファイルに含まれている必要がある。
- /etc/cron.deny – cron.arrowファイルが存在せず、cron.denyファイルが存在する場合、cronジョブを使用するにはユーザー名がcron.denyファイルに含まれていない必要がある。
どちらのファイルも存在しない場合、サイト固有の設定パラメーターにより、スーパーユーザーのみがcronジョブを使用できるか、すべてのユーザーがcronジョブを使用できるかが決定される。
タイムゾーンの処理
多くのcron実装は、crontabの項目をcronデーモンが実行されているシステムのタイムゾーンの設定に基づいて解釈する。複数のユーザー向けの大規模なマシンで、ユーザーが地理的に複数のタイムゾーンに分散しているケースで、特にシステムのデフォルトのタイムゾーンが混乱を招くおそれのある夏時間を採用している場合、これは問題となる場合がある。このため、cron実装の中には、ユーザーのcrontabのCRON_TZ=[タイムゾーン]
の形式を取る行を認識して、その行以降のcrontabの項目を指定されたタイムゾーンに基づいて解釈するものもある[12]。
式
cronの式は、時間を指定するホワイトスペースで区切られた5つまたは6つの欄の文字列で[13]、特定の作業を予約する。
コメントは#
で始まる。
欄 | 必須 | 許容される値 | 許容される特殊文字 | 備考 |
---|---|---|---|---|
分 | Yes | 0〜59 | * , -
|
|
時 | Yes | 0〜23 | * , -
|
|
日 | Yes | 1〜31 | * , - ? L W
|
? L W は一部の実装でのみ許容される。
|
月 | Yes | 1〜12
JAN〜DEC |
* , -
|
|
曜日 | Yes | 0〜6
SUN〜SAT |
* , - ? L #
|
? L # は一部の実装でのみ許容される。
|
年 | No | 1970〜2099 | * , -
|
この欄は標準・デフォルトの実装ではサポートされない。 |
月と曜日の省略記法は大文字・小文字が区別されない。
システムのcrontabファイル(/etc/crontab)には、コマンドを指定する欄の直前にユーザー名を指定する欄が存在する。この欄は通常root
に設定される。
また、一部の実装では、行の最初に秒の指定欄が存在する場合もある。この場合、各行に6つまたは7つの欄が存在することになる[14]。
- アスタリスク(
*
) - アスタリスク(ワイルドカード)は「すべて」を表す。例えば、
* * * * *
を指定すると、ジョブが毎分実行される。* * * * 1
を指定すると、ジョブが月曜日にのみ毎分実行される。秒の指定に対応している場合、アスタリスクを6個指定するとジョブが毎秒実行される。
- コンマ(
,
) - コンマは、値を複数指定するのに使う。例えば、5番目の欄で
MON,WED,FRI
は「月曜日・水曜日・金曜日」を指す。
- ハイフン(
-
) - ハイフンは範囲を表す。例えば、
2000-2010
は、2000年から2010年までのすべての年を指す。
- パーセント(
%
) - コマンド内のパーセント(
%
)は、バックスラッシュ(\
)でエスケープされていない場合、改行文字に変換され、最初の%
以降のデータが標準入力としてコマンドに渡される[15]。
非標準文字
以下は、Javaのジョブ管理ツールQuartzなど、一部のcron実装にのみ存在する非標準の文字である。
L
L
は「最後の(last)」を意味する。曜日欄で、「最後の金曜日」(5L
)などを指定するのに使う。日欄では、月の最終日を指定するのに使う。
W
W
は、日欄で使用でき、その日に最も近い平日(月曜日〜金曜日)を指定できる。例えば、15W
と記入すると、15日に最も近い平日が指定され、15日が土曜日であれば、14日(金曜日)にジョブが実行される。また、15日が日曜日であれば、16日(月曜日)に実行される。15日が火曜日であれば、そのまま15日(火曜日)に実行される。ただし、日欄に1W
を指定し、1日が土曜日であった場合、ジョブは月を跨がず3日(月曜日)に実行される。W
は、日の範囲指定や一覧指定には使用できない。
- ハッシュ(
#
) #
は、曜日欄で使用でき、この記号に続いて1〜5の数字を指定する。月の「第2金曜日」などを指定するのに使う[16]。例えば、5#3
と記入すると、毎月第3金曜日にジョブが実行される。
- クエスチョンマーク(
?
) - 一部の実装では、月・曜日欄を空欄にする際に
*
の代わりに?
を使う。その他の実装では、?
がデーモンが起動した時間に置き換えられる。例えば、デーモンが午前8時25分に起動した場合には? ? * * * *
が25 8 * * * *
と解釈され、再起動されるまで毎日この時間に実行される[17]。
- スラッシュ(
/
) - Vixie Cronでは、スラッシュは範囲と組み合わせて刻み値を指定するのに使う[18]。例えば、分欄に
*/5
と記入すると、毎5分が指定される。より冗長なPOSIXの5,10,15,20,25,30,35,40,45,50,55,00
の省略表記である。POSIXにはスラッシュの用法に関する定義がない[8]。
H
H
はJenkins継続的インテグレーションシステムで使用できる。例えば、20 * * * *
(毎時20分)を指定する代わりに、H * * * *
を指定して、ジョブを1時間に1回、未指定(ただし一定)の時間に継続的に実行するよう指定できる。これにより、各ジョブがそれぞれ別のタイミングで分散して実行されるようになり、複数のジョブが同じタイミングで実行されてリソースを奪い合うことを防ぐことができる[19]。
関連項目
脚注
- ^ “Difference between cron, crontab, and cronjob?” (英語). Stack Overflow. 2023年8月31日閲覧。
- ^ “What Is a Cron Job: Understanding Cron Syntax and How to Configure Cron Jobs”. Hostinger (2023年4月14日). 2023年8月31日閲覧。
- ^ “Automation with Cron job on Centos 8”. Comtronic (2020年4月6日). 2023年8月31日閲覧。
- ^ “Crontab – Quick Reference”. Admin's Choice (2009年12月21日). 2023年8月31日閲覧。
- ^ “Newbie Introduction to cron”. Unix Geeks (1999年12月30日). 2023年8月31日閲覧。
- ^ “Linux – cron and crontab”. Cornell University. 2019年6月4日時点のオリジナルよりアーカイブ。2023年8月31日閲覧。
- ^ ディストリビューションの種類による。
- ^ a b “crontab”. The Open Group Base Specifications. The IEEE and The Open Group. (2018) 2023年8月31日閲覧。
- ^ “Cron expressions reference”. Amazon Web Services. 2023年8月31日閲覧。
- ^ “crontab(5)”. FreeBSD File Formats Manual. The FreeBSD Project 2023年8月31日閲覧。
- ^ “#77563 – cron: crontab(5) lies, '@reboot' is whenever cron restarts, not the system”. Debian BTS. 2023年8月31日閲覧。
- ^ “crontab(5): tables for driving cron – Linux man page”. die.net. 2023年8月31日閲覧。
- ^ “Ubuntu Cron Howto”. Ubuntu (2016年11月20日). 2023年8月31日閲覧。
- ^ “CronTrigger Tutorial”. Quartz Scheduler. 2011年10月25日時点のオリジナルよりアーカイブ。2023年9月1日閲覧。
- ^ “mcron crontab reference”. GNU. 2023年8月31日閲覧。
- ^ “Oracle® Role Manager Integration Guide”. Oracle. 2023年8月31日閲覧。
- ^ “Cron format”. nnCron. 2023年8月31日閲覧。
- ^ “FreeBSD File Formats Manual for CRONTAB(5)”. The FreeBSD Project. 2023年8月31日閲覧。
- ^ “Timer Trigger Syntax”. Jenkins. 2023年8月31日閲覧。
外部リンク
crontab
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/08/08 22:04 UTC 版)
![]() |
![]() | この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。(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
)。もしくは、引数無しで起動した上で、標準入力からコマンドを直接指定することもできる。
脚注
- ^ YouTube - crontab プレゼンテーション等
- ^ “FreeBSD File Formats Manual for CRONTAB(5)”. The FreeBSD Project. 2021年4月25日閲覧。
関連項目
外部リンク
- マニュアル
- 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 リファレンス)
- ソフトウェア
Cron for Windows(リンク切れ)- CVSweb for FreeBSD's cron - 1993年のポール・ヴィクシーによるVixie cron 3.0 リリース
- fcron - vixiecron および anacron の拡張代替実装 (GPL)
- Crontabのページへのリンク