cronとは何ですか?

Cronは、事前設定された時間に実行するタスクを割り当てることができるスケジューリングユーティリティです。 基本的なツールであるcronを使用して、定期的に発生する必要のあるシステム上のほぼすべてのものを自動化できます。

毎時または毎日実行する必要のあるタスクと、年に1〜2回実行する必要のある大規模なルーチンの管理にも同様に精通しているcronは、システム管理者にとって不可欠なツールです。

このガイドでは、コマンドラインからcronを使用する方法と、その構成ファイルを読み取る方法について説明します。 また、サーバーの電源がオフになっている場合でもタスクを確実に実行するために使用できるツールであるanacronについても説明します。

Ubuntu 12.04 VPSを使用しますが、最新のLinuxディストリビューションも同様に動作するはずです。

cronのしくみ

Cronは起動時に起動され、デーモンとしてバックグラウンドで実行されます。 これは、ユーザーの操作なしで実行され、特定のイベントが発生するのを待って、いつ実行するかを決定することを意味します。

cronの場合、これらのイベントは特定の瞬間です。 Cronはバックグラウンドで実行され、構成ファイルを1分ごとにチェックして、イベントがその分に実行されるようにスケジュールされているかどうかを確認します。

イベントがスケジュールされている場合、cronは事前に設定されたコマンドを実行してから、さらに1分間バックグラウンドに戻ります。 イベントがスケジュールされていない場合は、60秒待機してから再度チェックします。

この分単位のスケジューリングにより、非常に柔軟で構成可能です。 ディストリビューションをインストールすると、cronはさまざまなタスクを実行するようにすでに構成されています。

crontabの読み方

Cronは、それぞれが「crontab」と呼ばれる一連のファイルを読み取ることにより、どのコマンドをいつ実行するかを決定します。 「/etc/ crontab」を見ると、システム全体のcrontabを確認できます。

less /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

これはシステムのcrontabであり、ほとんどの場合編集しないでください。 ほとんどの場合、独自のcrontabを使用することをお勧めします。 システムファイルはアップデートで置き換えられる可能性があり、変更は失われます。

このファイルには、理解する必要のある興味深い部分がいくつかあります。

最初の2行は、リストされているコマンドを実行するシェルと、プログラムをチェックするためのパスを指定します。

ファイルの残りの部分は、実際のコマンドとスケジューリングを指定します。 このリストの行はそれぞれ、テーブル内のレコードまたは行を表します。 「crontab」の「tab」はテーブルを表します。 各テーブルセルは、スペースまたはタブで区切られた列で表されます。

表の上のコメント行は、各列が何を表しているかについてのヒントを示しています。

# m h dom mon dow user  command

cronを使用した時間と分のスケジューリング

最初の列は、コマンドを実行する時間の分(0〜59)です。 2番目の列は、実行する必要がある0〜23の時間です。 アスタリスク(*)は「可能な限りの値」を意味し、ワイルドカードとして使用されます。

これらの最初の2つの列を組み合わせることで、コマンドの時間値を取得できます。 たとえば、表の2行目は、分列に25、時間列に6があります。

25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

これは、2番目のラインが午前6時25分に実行される必要があることを意味します。

同様に、最初の行は、コマンドが1時間ごとに実行され、17分が1時間経過したことを意味します。

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly

したがって、午前1時17分、午前2時17分、午前3時17分などに実行されます。

cronによる日数のスケジューリング

3番目、4番目、および5番目の列は、コマンドを実行する日を決定します。 3番目の列は、月の日1〜31を指定します(すべての月の日数が同じであるとは限らないため、月の後半にスケジュールする場合は注意してください)。

4番目の列は、コマンドを実行する1〜12の月を指定し、5番目の列は、コマンドを実行する曜日を指定するために予約されています。0と7はどちらも日曜日を意味します。 この最後の1つでは、月単位ではなく週単位でスケジュールを設定できます。

曜日と曜日の両方の列にワイルドカードではない値が含まれている場合、いずれかの列が一致するとコマンドが実行されます。

曜日と月は、名前の最初の3文字で指定することもできます。 ハイフン(-)を使用して範囲を使用し、コンマ(、)を使用して複数の値を選択することもできます。

/と数値を使用して値を追跡することにより、間隔を指定することもできます。 たとえば、1時間おきにコマンドを実行するには、「時間」列に「*/2」を配置します。

crontabを見ると、3番目のレコードが毎週日曜日の午前6時47分に実行されていることがわかります。

47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )

4番目のレコードは、月の1日の午前6時52分に実行されます。

52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

時間ショートカットを使用したスケジュール

単純な要件がある場合は、各レコードの最初の5列を名前付きショートカットに置き換えることができます。 これらの構文は、「@」の後に名前付き間隔が続きます。

たとえば、5列の構成を作成する代わりに、「@ weekly」を指定することで、毎週実行されるようにスケジュールを設定できます。 その他の選択肢は、「@ yearly」、「@ monthly」、「@ daily」、および「@hourly」です。

cronが開始されるとすぐに実行される「@reboot」と呼ばれる特別なショートカットもあります。 これは通常、システムの起動時にのみ発生します。そのため、「cron-restart」などではなく「reboot」と呼ばれます。

これらのショートカットは、いつ実行されるかをきめ細かく制御できないことに注意してください。 また、これらはすべて、一致する時間の最初の可能な瞬間に実行されるように構成されています。

たとえば、「@monthly」は月の最初の深夜に実行されます。 これにより、すべてが同時に実行される場合、一度に実行するようにスケジュールされた多くのコマンドが発生する可能性があります。 従来のスケジューリング構文のように、これらのイベントをずらすことはできません。

Cronを使用したコマンドとユーザーの指定

次の列には、スケジュールされたコマンドの実際の実行が含まれます。

私たちが見ているシステムcrontabにのみ存在する6番目の列は、コマンドを実行するユーザーを示しています。

最後の列は、実行する必要のある実際のコマンドを指定します。 コマンドにはパーセント記号(%)を含めることができます。これは、最初のパーセント記号以外のすべてが標準入力としてコマンドに渡されることを意味します。

すべてのレコードは、改行文字で終了する必要があります。 これはほとんどのエントリでは問題になりませんが、最後のエントリの後に空白行があることを確認してください。そうしないと、コマンドが正しく実行されません。

run-partsとcronディレクトリの使用

システムのcrontabで指定されているコマンドを見ると、後で説明する「anacron」と「run-parts」についての言及があります。

run-partsコマンドは、指定されたディレクトリ内にあるすべての実行可能ファイルを実行する単純なコマンドです。 複数のスクリプトを1つの場所に配置することで、指定した時間に複数のスクリプトを実行できるため、cronで広く使用されています。

これには、crontabをクリーンでシンプルに保つことができ、crontabを調整する代わりに、スクリプトを適切なディレクトリに配置またはリンクするだけでスクリプトを追加できるという利点があります。

デフォルトでは、ほとんどのディストリビューションは間隔ごとにフォルダーを設定し、その間隔で実行するスクリプトまたはスクリプトへのリンクを配置します。

たとえば、Ubuntuには、「cron.daily」、「cron.hourly」、「cron.monthly」、および「cron.weekly」という名前のフォルダーがあります。 これらのフォルダの中には、適切なスクリプトがあります。

ユーザー固有のcronタブの使用

cronの構文を理解したので、これを使用して、自分のユーザーのスケジュールされたタスクを作成できます。 これは「crontab」コマンドで実行できます。

crontabのコマンドはユーザー権限で実行されるため、「user」列はユーザー固有のcrontabには存在しません。

現在のcrontabを表示するには、次のように入力します。

crontab -l

特に手作業で作成しない限り、おそらく持っていないでしょう。 crontabがある場合は、編集する前に現在のコピーをバックアップして、行った変更を元に戻すことができるようにすることをお勧めします。

バックアップをホームディレクトリの「cron.bak」というファイルに保存するには、次のコマンドを実行します。

crontab -l > ~/cron.back

crontabを編集するには、次のように入力します。

crontab -e
no crontab for demouser - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny

このコマンドを初めて使用すると、上記のような選択プロンプトが表示される場合があります。 続行するエディターを選択します。

コメント付きのファイルにドロップされ、編集して独自のルールを作成できます。

無意味な例として、毎週水曜日に15分ごとに日付をファイルにエコーしたい場合は、次の行をファイルに配置できます。

*/15 * * * 3 echo "$(date)" >> /home/demouser/file

次にファイルを保存できます。「crontab-l」を実行すると、作成したルールが表示されます。

crontab -l
. . .
. . .
*/15 * * * 3 echo "$(date)" >> /home/demouser/file

特定のユーザーのcrontabを編集する必要がある場合は、「-uusername」オプションを追加することもできます。 これは、rootとして、または管理者権限を持つアカウントでのみ実行できます。

たとえば、「ルート」crontabに何かを追加したい場合は、次のように発行できます。

sudo crontab -u root -e

cronでのAnacronの使用

cronの最大の弱点の1つは、サーバーまたはコンピューターが常にオンになっていることを前提としていることです。 マシンの電源がオフで、その間にタスクがスケジュールされている場合、タスクは実行されません。

これは、常にオンになることを保証できないシステムでは深刻な問題です。 このシナリオのために、「anacron」と呼ばれるツールが開発されました。 Anacronはanachronisticの略で、cronでこの問題を補うために使用されます。

Anacronは、cronのオプションほど詳細ではないパラメーターを使用します。 anacronが理解する最小の増分は日数です。 つまり、anacronは、cronを置き換えるのではなく、cronを補完するために使用する必要があります。

Anacronの利点は、タイムスタンプ付きのファイルを使用して、コマンドが最後に実行された時刻を確認できることです。 つまり、タスクが毎日実行されるようにスケジュールされていて、その間にコンピューターの電源がオフになっている場合、anacronを実行すると、タスクが24時間以上前に最後に実行されたことがわかり、タスクを正しく実行できます。

anacronユーティリティには、cronと同じようにスケジューリングテーブルがあります。 これは適切に「anacrontab」という名前で、「/etc」ディレクトリにもあります。 それがどのようにフォーマットされているか見てみましょう:

less /etc/anacrontab
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# These replace cron's entries
1       5       cron.daily       nice run-parts --report /etc/cron.daily
7       10      cron.weekly      nice run-parts --report /etc/cron.weekly
@monthly        15      cron.monthly nice run-parts --report /etc/cron.monthly

「crontab」ファイルと同様の形式に従っていることがわかりますが、列が少なく、いくつかの顕著な違いがあります。

最初の列は、コマンドを実行する頻度を指定します。 日単位の間隔として指定されます。 値「1」は毎日実行され、値「3」は3日ごとに実行されます。

2番目の列は、コマンドを実行する前に使用する遅延です。 Anacronはデーモンではありません。 一度に明示的に実行されます。 このフィールドを使用すると、すべてのタスクが同時に実行されるとは限らないように、実行をずらすことができます。

たとえば、最初の行は、anacronが呼び出されてから5分後に毎日実行されます。

1       5       cron.daily       nice run-parts --report /etc/cron.daily

次の行は、anacronが呼び出されてから10分後に、毎週(7日ごと)実行されます。

7       10      cron.weekly      nice run-parts --report /etc/cron.weekly

3番目の列には、anacronのメッセージおよびログファイルでジョブが認識される名前が含まれています。 4番目のフィールドは、実行される実際のコマンドです。

anacronがcronによって実行されるのと同じスクリプトのいくつかを実行するように設定されていることがわかります。 ディストリビューションは、cronまたはanacronのいずれかの設定を作成し、他のプログラムがルールを実行しないようにすることで、この衝突を異なる方法で処理します。

たとえば、Ubuntuでは、「/ etc / crontab」はanacronがシステムで使用可能かどうかをテストし、anacronが見つからない場合にのみcron。*ディレクトリ内のスクリプトを実行します。

他のディストリビューションでは、これらのディレクトリのコンテンツを実行するたびにcronがanacronのタイムスタンプを更新するため、anacronが呼び出されたときに実行されません。

結論

cronとanacronはどちらも、プロセスを自動化する必要がある場合に役立つツールです。 それらの長所を活用し、短所を回避する方法を理解することで、それらを簡単かつ効果的に利用できるようになります。

構成構文は最初は混乱するかもしれませんが、これらのツールは長期的には時間を節約し、通常、適切な作業スケジュールができたら頻繁に調整する必要はありません。