序章

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

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

前提条件

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

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

cronのインストール

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

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

  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. システム上の各ユーザープロファイルは、独自のプロファイルを持つことができます crontab 下に保存されているジョブをスケジュールできる場所 /var/spool/cron/crontabs/.

仕事をスケジュールするには、 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 * * * * ....
  • /:アスタリスク付きのスラッシュを使用して、ステップ値を表すことができます。 たとえば、8つの別々の別々に書き出す代わりに cron 3時間ごとにコマンドを実行するタスク(のように、 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は便利な cron 「CrontabGuru」という名前のスケジュール式エディターを使用して、 cron スケジュールは有効です。

crontabの管理

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

前述のように、 crontab ジョブのスケジュールを保持する特別なファイルです cron 実行されます。 ただし、これらは直接編集するためのものではありません。 代わりに、 crontab 指図。 これにより、ユーザープロファイルを編集できます crontab で特権を変更せずに sudo. The 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 + X, Y、 それから ENTER 選択した場合 nano).

:Linuxシステムには、別のシステムがあります crontab 下に保存 /etc/ ディレクトリ。 これはシステム全体です 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ユーザープロファイルに関連付けられた電子メールアドレスへのタスク。 を提供することにより、手動でメールアドレスを指定することもできます 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 jobは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は、システム管理に関連する多くのタスクの負担を軽減できる柔軟で強力なユーティリティです。 シェルスクリプトと組み合わせると、通常は面倒または複雑なタスクを自動化できます。 たとえば、シェルスクリプトを記述してデータバックアップをオブジェクトストレージソリューションに送信し、それをcronで自動化できます。