CentOS8でタスクを自動化するためにcronを使用する方法

提供:Dev Guides
移動先:案内検索

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

序章

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

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

前提条件

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

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

cronのインストール

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

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

sudo dnf update

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

sudo dnf install crontabs

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

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

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

sudo systemctl start crond.service

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

sudo systemctl enable crond.service

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

cronのしくみを理解する

cronジョブは、crontabと呼ばれる特別なファイルに記録および管理されます。 システム上の各ユーザープロファイルは、/var/spool/cron/の下に保存されているジョブをスケジュールできる独自の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 が、「CrontabGuru」という名前の便利なcronスケジュール式エディターを提供します。 cronスケジュールが有効かどうかを確認するために使用します。

crontabの管理

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

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

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

crontab -e

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

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

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

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

sudo dnf install nano

プロンプトが表示されたら、yENTERの順に押して、nanoをインストールすることを確認します。

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

nano ~/.bash_profile

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

〜/ .bash_profile

. . .
export VISUAL="nano"

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

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

. ~/.bash_profile

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

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

sudo nano /etc/crontab

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

crontab -l

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

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


crontab -r

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

crontab -r -i
Outputcrontab: really delete sammy's crontab?

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

cronジョブ出力の管理

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

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

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

. . .

MAILTO="[email protected]"
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ステートメントが含まれている場合でも、コマンドの出力は指定された電子メールアドレスに送信されません。

アクセスの制限

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

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

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

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

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

sudo crontab -u user -e

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

OutputThe user user cannot use this program (crontab)

デフォルトでは、cron.allowまたはcron.denyのいずれかが存在しない限り、ほとんどのcronデーモンはすべてのユーザーが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は、システム管理に関連する多くのタスクの負担を軽減できる柔軟で強力なユーティリティです。 シェルスクリプトと組み合わせると、通常は面倒または複雑なタスクを自動化できます。