このチュートリアルの以前のバージョンは、ShaunLewisによって作成されました。

序章

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

このガイドでは、cronの特別な構文を使用してタスクをスケジュールする方法の概要を説明します。 また、ジョブスケジュールを記述して理解しやすくするために使用できるいくつかのショートカットについても説明します。

前提条件

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

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

cronのインストール

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

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

  1. sudo dnf update

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

  1. sudo dnf install crontabs

このコマンドは、インストールすることを確認するためのプロンプトを表示します crontabs パッケージとその依存関係。 を押してそうします y それから ENTER.

これにより、システムにcronがインストールされますが、デーモンを手動で起動する必要があります。 また、サーバーが起動するたびに実行されるように設定されていることを確認する必要があります。 これらのアクションの両方を実行できます systemctl 指図。

cronデーモンを起動するには、次のコマンドを実行します。

  1. sudo systemctl start crond.service

サーバーが起動するたびにcronを実行するように設定するには、次のように入力します。

  1. sudo systemctl enable crond.service

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

cronのしくみを理解する

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

ジョブをスケジュールするには、編集用に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式の機能例を次に示します。 この式はコマンドを実行します curl http://www.google.com 毎週火曜日の午後5時30分:

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

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

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

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

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

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

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

crontabの管理

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

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

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

  1. crontab -e

これにより、ユーザープロファイルのデフォルトのテキストエディタでcrontabが開きます。

:新しいCentOS 8サーバーでは、 crontab -e コマンドは、ユーザーのcrontabを次のように開きます。 vi デフォルトでは。 vi は非常に強力で柔軟なテキストエディタですが、経験が不足しているユーザーにとってはやや鈍感に感じる可能性があります。

より親しみやすいテキストエディタをデフォルトのcrontabエディタとして使用したい場合は、インストールして設定できます nano そのような。

これを行うには、インストールします nanodnf:

  1. sudo dnf install nano

プロンプトが表示されたら、を押します y その後 ENTER インストールすることを確認します nano.

設定するには nano ユーザープロファイルのデフォルトのビジュアルエディターとして、 .bash_profile 編集用のファイル。 インストールしたので、次の方法でインストールできます。 nano:

  1. nano ~/.bash_profile

ファイルの最後に、次の行を追加します。

〜/ .bash_profile
. . .
export VISUAL="nano"

これにより、 VISUAL 環境変数から nano. VISUAL は、crontabを含む多くのプログラムがファイルを編集するために呼び出すUnix環境変数です。 この行を追加したら、を押してファイルを保存して閉じます CTRL + X, Y、 それから ENTER.

次にリロードします .bash_profile したがって、シェルは新しい変更を取得します。

  1. . ~/.bash_profile

エディターに入ると、新しい行の各ジョブでスケジュールを入力できます。 それ以外の場合は、今のところcrontabを保存して閉じることができます。 でcrontabを開いた場合 vi、デフォルトのCentOS 8テキストエディタ。を押すと、これを行うことができます。 ESC あなたがいることを確認するために viのコマンドモード、次に次のように入力します :x を押して ENTER.

Linuxシステムでは、下に別のcrontabが保存されていることに注意してください。 /etc/ ディレクトリ。 これはシステム全体のcrontabであり、各cronジョブを実行する必要があるユーザープロファイル用の追加フィールドがあります。 このチュートリアルはユーザー固有のcrontabに焦点を当てていますが、システム全体の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 crontabを削除するにはまたは n 削除をキャンセルします。

cronジョブ出力の管理

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

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

たとえば、次の行を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、これにより、基本的にスクリプトをサイレントに実行できます。 crontabに MAILTO ステートメントの場合、コマンドの出力は指定された電子メールアドレスに送信されません。

アクセスの制限

どのユーザーに使用を許可するかを管理できます crontab とのコマンド cron.allowcron.deny 両方ともに保存されているファイル /etc/ ディレクトリ。 の場合 cron.deny ファイルが存在する場合、そのファイルにリストされているユーザーはcrontabを編集できなくなります。 もしも cron.allow 存在する場合、そこにリストされているユーザーのみがcrontabを編集できます。 両方のファイルが存在し、それぞれに同じユーザーがリストされている場合、 cron.allow ファイルは上書きされます cron.deny ユーザーはcrontabを編集できるようになります。

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

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

まず、追加してすべてのユーザーをロックアウトします ALLcron.deny ファイル。 次に、ユーザー名をに追加します 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にアクセスできると想定します。 cron.allow また cron.deny 存在します。

特別な構文

ジョブのスケジューリングを合理化するために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は、システム管理に関連する多くのタスクの負担を軽減できる柔軟で強力なユーティリティです。 シェルスクリプトと組み合わせると、通常は面倒または複雑なタスクを自動化できます。