序章

Cron は、Linuxディストリビューションを含むUnixライクなオペレーティングシステムに見られる時間ベースのジョブスケジューリングデーモンです。 cronはバックグラウンドで実行され、cronでスケジュールされた操作(「cronジョブ」と呼ばれる)が自動的に実行されるため、cronはメンテナンス関連のタスクを自動化するのに役立ちます。

このガイドでは、cronの特別な構文を使用してタスクをスケジュールする方法の概要を説明します。 また、ジョブスケジュールを作成するプロセスを促進し、それらをより理解しやすくするために使用できるいくつかのショートカットについても説明します。

前提条件

このガイドを完了するには、Ubuntu18.04を実行しているコンピューターにアクセスする必要があります。 これは、ローカルマシン、仮想マシン、または仮想プライベートサーバーである可能性があります。

このガイドに従うために使用するコンピューターの種類に関係なく、管理者権限を持つroot以外のユーザーが構成されている必要があります。 これを設定するには、 Ubuntu18.04の初期サーバーセットアップガイドに従ってください。

cronのインストール

ほとんどすべてのLinuxディストリビューションには、デフォルトで何らかの形式のcronがインストールされています。 ただし、cronがインストールされていないUbuntuマシンを使用している場合は、APTを使用してインストールできます。

Ubuntuマシンにcronをインストールする前に、コンピューターのローカルパッケージインデックスを更新してください。

  1. sudo apt update

次に、次のコマンドを使用してcronをインストールします。

  1. sudo apt install cron

バックグラウンドでも実行するように設定されていることを確認する必要があります。

  1. sudo systemctl enable cron
Output
Synchronizing state of cron.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable cron

その後、cronがシステムにインストールされ、ジョブのスケジュールを開始できるようになります。

cronのしくみを理解する

cronジョブは、crontabと呼ばれる特別なファイルに記録および管理されます。 システム上の各ユーザープロファイルは、/var/spool/cron/crontabs/の下に保存されているジョブをスケジュールできる独自のcrontabを持つことができます。

ジョブをスケジュールするには、crontabを開いて編集し、cron式の形式で記述されたタスクを追加します。 cron式の構文は、スケジュールと実行するコマンドの2つの要素に分けることができます。

コマンドは、コマンドラインで通常実行する実質的にすべてのコマンドにすることができます。 構文のスケジュールコンポーネントは、次の順序で記述された5つの異なるフィールドに分割されます。

分野 許容値
0-59
時間 0-23
月の日 1-31
1-12またはJAN-DEC
曜日 0-6またはSUN-SAT

一緒に、crontabでスケジュールされたタスクは次のように構成されています。

minute hour day_of_month month day_of_week command_to_run

cron式の機能例を次に示します。 この式は、毎週火曜日の午後5時30分にコマンドcurl http://www.google.comを実行します。

30 17 * * 2 curl http://www.google.com

スケジューリングタスクを合理化するために、cron式のスケジュールコンポーネントに含めることができるいくつかの特殊な文字もあります。

  • *:cron式では、アスタリスクは「すべて」を表すワイルドカード変数です。 したがって、* * * * * ...でスケジュールされたタスクは、毎月の毎日の毎時の毎分実行されます。
  • ,:コンマはスケジューリング値を分割してリストを形成します。 2つの別々のタスク(0 * * * * ...30 * * * * ...など)を書き出すのではなく、1時間ごとの最初と途中でタスクを実行したい場合は、1つで同じ機能を実現できます。 (0,30 * * * * ...)。
  • -:ハイフンは、スケジュールフィールドの値の範囲を表します。 1時間ごとの最初の30分間に実行するコマンドに対して30の個別のスケジュールされたタスクを設定する代わりに(0 * * * * ...1 * * * * ...2 * * * * ...など)代わりに、0-29 * * * * ...としてスケジュールすることができます。
  • /:アスタリスク付きのスラッシュを使用して、ステップ値を表すことができます。 たとえば、3時間ごとにコマンドを実行する8つの個別のcronタスクを書き出す代わりに(0 0 * * * ...0 3 * * * ...0 6 * * * ...、およびなど)、次のように実行するようにスケジュールできます:0 */3 * * * ...

:ステップ値を任意に表現することはできません。 問題のフィールドで許可されている範囲に均等に分割される整数のみを使用できます。 たとえば、「時間」フィールドでは、12346でのみスラッシュをたどることができます。 ]、8、または12

cronのスケジューリングコンポーネントを使用する方法のその他の例を次に示します。

  • * * * * *-1分ごとにコマンドを実行します。
  • 12 * * * *-1時間ごとに12分後にコマンドを実行します。
  • 0,15,30,45 * * * *-15分ごとにコマンドを実行します。
  • */15 * * * *-15分ごとにコマンドを実行します。
  • 0 4 * * *-毎日午前4:00にコマンドを実行します。
  • 0 4 * * 2-4-毎週火曜日、水曜日、木曜日の午前4時にコマンドを実行します。
  • 20,40 */8 * 7-12 *-その年の最後の6か月の毎日、8時間ごとの20分と40分にコマンドを実行します。

このような紛らわしい点がある場合、または独自のcronタスクのスケジュールの作成についてサポートが必要な場合は、Cronitorという名前の便利なcronスケジュール式エディターを提供します。 cronのスケジュールが有効かどうかを確認するために使用できる「crontabGuru」

crontabの管理

スケジュールが決まったら、実行したいジョブがわかったら、デーモンが読み取れる場所に配置する必要があります。

前述のように、crontabは、cronが実行されるジョブのスケジュールを保持する特別なファイルです。 ただし、これらは直接編集するためのものではありません。 代わりに、crontabコマンドを使用することをお勧めします。 これにより、sudoで権限を変更せずに、ユーザープロファイルのcrontabを編集できます。 crontabコマンドは、crontabに構文エラーがあるかどうかも通知しますが、直接編集する場合は通知しません。

次のコマンドを使用して、crontabを編集できます。

  1. crontab -e

このユーザープロファイルでcrontabコマンドを初めて実行する場合は、crontabの編集時に使用するデフォルトのテキストエディタを選択するように求められます。

Output
no crontab for sammy - 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 4. /bin/ed Choose 1-4 [1]:

選択したエディターに対応する番号を入力します。 または、ENTERを押して、デフォルトの選択であるnanoを受け入れることもできます。

選択すると、新しいcrontabには、コメントアウトされた使用方法が記載されています。

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

今後crontab -eを実行すると、このテキストエディタにcrontabが自動的に表示されます。 エディターに入ると、新しい行の各ジョブでスケジュールを入力できます。 それ以外の場合は、今のところcrontabを保存して閉じることができます(CTRL + XYnanoを選択した場合はENTER)。

:Linuxシステムでは、/etc/ディレクトリの下に別のcrontabが保存されています。 これはシステム全体のcrontabであり、各cronジョブを実行する必要があるユーザープロファイル用の追加フィールドがあります。 このチュートリアルはユーザー固有のcrontabsに焦点を当てていますが、システム全体のcrontabを編集する場合は、次のコマンドを使用して編集できます。

  1. sudo nano /etc/crontab

crontabの内容を表示したいが編集したくない場合は、次のコマンドを使用できます。

  1. crontab -l

次のコマンドを使用して、crontabを消去できます。

警告:次のコマンドでは、crontabを消去するかどうかの確認を求められません。 消去したいことが確実な場合にのみ実行してください

  1. crontab -r

このコマンドは、ユーザーのcrontabをすぐに削除します。 ただし、-iフラグを含めて、ユーザーのcrontabを実際に削除するかどうかを確認するようにコマンドプロンプトで表示することができます。

  1. crontab -r -i
Output
crontab: really delete sammy's crontab? (y/n)

プロンプトが表示されたら、yと入力してcrontabを削除するかnと入力して削除をキャンセルする必要があります。

cronジョブ出力の管理

cronジョブはバックグラウンドで実行されるため、正常に実行されたことが常に明らかであるとは限りません。 crontabコマンドの使用方法と、cronジョブのスケジュール方法がわかったので、cronジョブの出力をリダイレクトするさまざまな方法を試してみることができます。それらが正常に実行されたことを追跡します。

メール転送エージェント Sendmail など)がサーバーにインストールされ、適切に構成されている場合は、cronタスクの出力を関連付けられたメールアドレスに送信できます。 Linuxユーザープロファイルを使用します。 crontabの上部にあるMAILTO設定を指定して、手動でメールアドレスを指定することもできます。

たとえば、次の行をcrontabに追加できます。 これらには、MAILTOステートメントとそれに続く電子メールアドレスの例、実行するシェルを示すSHELLディレクティブ(この例ではbash)、HOMEが含まれます。 cronバイナリを検索するパスを指すディレクティブ、および単一のcronタスク:

. . .

MAILTO="example@digitalocean.com"
SHELL=/bin/bash
HOME=/

* * * * * echo ‘Run this command every minute’

この特定のジョブは「このコマンドを毎分実行」を返し、その出力はMAILTOディレクティブの後に指定された電子メールアドレスに毎分電子メールで送信されます。

cronタスクの出力をログファイルまたは空の場所にリダイレクトして、出力が記載された電子メールを受け取らないようにすることもできます。

スケジュールされたコマンドの出力をログファイルに追加するには、コマンドの最後に>>を追加し、その後に次のように選択したログファイルの名前と場所を追加します。

* * * * * echo ‘Run this command every minute’ >> /directory/path/file.log

cronを使用してスクリプトを実行し、バックグラウンドで実行し続けたいとします。 これを行うには、スクリプトの出力を/dev/nullのような空の場所にリダイレクトして、書き込まれたデータをすぐに削除します。 たとえば、次のcronジョブはPHPスクリプトを実行し、バックグラウンドで実行します。

* * * * * /usr/bin/php /var/www/domain.com/backup.php > /dev/null 2>&1

このcronジョブは、標準エラー2で表される)も標準出力(>&1)にリダイレクトします。 標準出力はすでに/dev/nullにリダイレクトされているため、これにより基本的にスクリプトをサイレントに実行できます。 crontabMAILTOステートメントが含まれている場合でも、コマンドの出力は指定された電子メールアドレスに送信されません。

アクセスの制限

[X70X]crontabコマンドの使用を許可するユーザーを管理できます。 cron.denyファイルが存在する場合、そのファイルにリストされているユーザーは、crontabの編集を禁止されます。 cron.allowが存在する場合、そこにリストされているユーザーのみがcronタブを編集できます。 両方のファイルが存在し、それぞれに同じユーザーがリストされている場合、cron.allowファイルはcron.denyを上書きし、ユーザーはcrontabを編集できます。

たとえば、すべてのユーザーへのアクセスを拒否してから、ユーザー ishmael へのアクセスを許可するには、次のコマンドシーケンスを使用できます。

  1. sudo echo ALL >>/etc/cron.deny
  2. sudo echo ishmael >>/etc/cron.allow

まず、cron.denyファイルにALLを追加して、すべてのユーザーをロックアウトします。 次に、cron.allowファイルにユーザー名を追加することにより、ishmaelユーザープロファイルにcronジョブを実行するためのアクセス権を付与します。

ユーザーがsudo権限を持っている場合、次のコマンドを使用して別のユーザーのcrontabを編集できることに注意してください。

  1. sudo crontab -u user -e

ただし、cron.denyが存在し、 user がリストされていて、cron.allowにリストされていない場合、前のコマンドを実行した後、次のエラーが発生します。

Output
The user user cannot use this program (crontab)

デフォルトでは、ほとんどのcronデーモンは、cron.allowまたはcron.denyのいずれかが存在しない限り、すべてのユーザーがcronにアクセスできると想定します。

特別な構文

crontabファイルで使用できるいくつかの省略コマンドもあり、ジョブのスケジューリングを合理化するのに役立ちます。 これらは基本的に、指定された同等の数値スケジュールのショートカットです。

ショートカット の省略形
@hourly 0 * * * *
@daily 0 0 * * *
@weekly 0 0 * * 0
@monthly 0 0 1 * *
@yearly 0 0 1 1 *

:すべてのcronデーモンがこの構文(特に古いバージョン)を解析できるわけではないため、信頼する前に動作を再確認してください。

さらに、@rebootの省略形は、サーバーが起動するたびに、それに続くコマンドを実行します。

@reboot echo "System start up"

可能な限りこれらのショートカットを使用すると、crontabのタスクのスケジュールを簡単に解釈できるようになります。

結論

Cronは、システム管理に関連する多くのタスクの負担を軽減できる柔軟で強力なユーティリティです。 シェルスクリプトと組み合わせると、通常は面倒または複雑なタスクを自動化できます。 たとえば、シェルスクリプトを記述してデータバックアップをオブジェクトストレージソリューションに送信し、それをcronで自動化できます。