Ubuntu18.04でCronを使用してタスクを自動化する方法
序章
Cron は、Linuxディストリビューションを含むUnixライクなオペレーティングシステムに見られる時間ベースのジョブスケジューリングデーモンです。 cronはバックグラウンドで実行され、cron
でスケジュールされた操作(「cronジョブ」と呼ばれる)が自動的に実行されるため、cronはメンテナンス関連のタスクを自動化するのに役立ちます。
このガイドでは、cronの特別な構文を使用してタスクをスケジュールする方法の概要を説明します。 また、ジョブスケジュールを作成するプロセスを促進し、それらをより理解しやすくするために使用できるいくつかのショートカットについても説明します。
前提条件
このガイドを完了するには、Ubuntu18.04を実行しているコンピューターにアクセスする必要があります。 これは、ローカルマシン、仮想マシン、または仮想プライベートサーバーである可能性があります。
このガイドに従うために使用するコンピューターの種類に関係なく、管理者権限を持つroot以外のユーザーが構成されている必要があります。 これを設定するには、 Ubuntu18.04の初期サーバーセットアップガイドに従ってください。
cronのインストール
ほとんどすべてのLinuxディストリビューションには、デフォルトで何らかの形式のcron
がインストールされています。 ただし、cron
がインストールされていないUbuntuマシンを使用している場合は、APTを使用してインストールできます。
Ubuntuマシンにcron
をインストールする前に、コンピューターのローカルパッケージインデックスを更新してください。
- sudo apt update
次に、次のコマンドを使用してcron
をインストールします。
- sudo apt install cron
バックグラウンドでも実行するように設定されていることを確認する必要があります。
- sudo systemctl enable cron
OutputSynchronizing 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 * * * ...
。
注:ステップ値を任意に表現することはできません。 問題のフィールドで許可されている範囲に均等に分割される整数のみを使用できます。 たとえば、「時間」フィールドでは、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がという名前の便利なcron
スケジュール式エディターを提供します。 cron
のスケジュールが有効かどうかを確認するために使用できる「crontabGuru」。
crontabの管理
スケジュールが決まったら、実行したいジョブがわかったら、デーモンが読み取れる場所に配置する必要があります。
前述のように、crontab
は、cron
が実行されるジョブのスケジュールを保持する特別なファイルです。 ただし、これらは直接編集するためのものではありません。 代わりに、crontab
コマンドを使用することをお勧めします。 これにより、sudo
で権限を変更せずに、ユーザープロファイルのcrontab
を編集できます。 crontab
コマンドは、crontab
に構文エラーがあるかどうかも通知しますが、直接編集する場合は通知しません。
次のコマンドを使用して、crontab
を編集できます。
- crontab -e
このユーザープロファイルでcrontab
コマンドを初めて実行する場合は、crontab
の編集時に使用するデフォルトのテキストエディタを選択するように求められます。
Outputno 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
、nano
を選択した場合はENTER
)。
注:Linuxシステムでは、/etc/
ディレクトリの下に別のcrontab
が保存されています。 これはシステム全体のcrontab
であり、各cron
ジョブを実行する必要があるユーザープロファイル用の追加フィールドがあります。 このチュートリアルはユーザー固有のcrontabs
に焦点を当てていますが、システム全体の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/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
にリダイレクトされているため、これにより基本的にスクリプトをサイレントに実行できます。 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
デーモンは、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で自動化できます。