CentOS8でタスクを自動化するためにcronを使用する方法
このチュートリアルの以前のバージョンは、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 * * * ...
のように実行するようにスケジュールできます。
注:ステップ値を任意に表現することはできません。 問題のフィールドで許可されている範囲に均等に分割される整数のみを使用できます。 たとえば、「時間」フィールドでは、1
、2
、3
、4
、6
のスラッシュのみをたどることができます。 ]、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
をそのようにインストールして構成できます。
これを行うには、nano
をdnf
とともにインストールします。
sudo dnf install nano
プロンプトが表示されたら、y
、ENTER
の順に押して、nano
をインストールすることを確認します。
nano
をユーザープロファイルのデフォルトのビジュアルエディターとして設定するには、.bash_profile
ファイルを開いて編集します。 インストールしたので、nano
を使用してインストールできます。
nano ~/.bash_profile
ファイルの最後に、次の行を追加します。
〜/ .bash_profile
. . . export VISUAL="nano"
これにより、VISUAL
環境変数がnano
に設定されます。 VISUAL
は、crontabを含む多くのプログラムがファイルを編集するために呼び出すUnix環境変数です。 この行を追加したら、CTRL + X
、Y
、ENTER
の順に押して、ファイルを保存して閉じます。
次に、.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は、システム管理に関連する多くのタスクの負担を軽減できる柔軟で強力なユーティリティです。 シェルスクリプトと組み合わせると、通常は面倒または複雑なタスクを自動化できます。