Ubuntu18.04でCronを使用してタスクを自動化する方法
序章
Cron は、Linuxディストリビューションを含むUnixライクなオペレーティングシステムに見られる時間ベースのジョブスケジューリングデーモンです。 Cronはバックグラウンドで実行され、操作は cron
「cronジョブ」と呼ばれるは自動的に実行されるため、cronはメンテナンス関連のタスクを自動化するのに役立ちます。
このガイドでは、cronの特別な構文を使用してタスクをスケジュールする方法の概要を説明します。 また、ジョブスケジュールを作成するプロセスを促進し、それらをより理解しやすくするために使用できるいくつかのショートカットについても説明します。
前提条件
このガイドを完了するには、Ubuntu18.04を実行しているコンピューターにアクセスする必要があります。 これは、ローカルマシン、仮想マシン、または仮想プライベートサーバーである可能性があります。
このガイドに従うために使用するコンピューターの種類に関係なく、管理者権限を持つroot以外のユーザーが構成されている必要があります。 これを設定するには、 Ubuntu18.04の初期サーバーセットアップガイドに従ってください。
cronのインストール
ほとんどすべてのLinuxディストリビューションには何らかの形式があります cron
デフォルトでインストールされます。 ただし、Ubuntuマシンを使用している場合 cron
がインストールされていない場合は、APTを使用してインストールできます。
インストールする前に cron
Ubuntuマシンで、コンピューターのローカルパッケージインデックスを更新します。
- 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
. システム上の各ユーザープロファイルは、独自のプロファイルを持つことができます 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
次のコマンドを使用します。
- 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
、 それから ENTER
選択した場合 nano
).
注:Linuxシステムには、別のシステムがあります crontab
下に保存 /etc/
ディレクトリ。 これはシステム全体です 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ユーザープロファイルに関連付けられた電子メールアドレスへのタスク。 を提供することにより、手動でメールアドレスを指定することもできます 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.allow
と cron.deny
両方ともに保存されているファイル /etc/
ディレクトリ。 の場合 cron.deny
ファイルが存在する場合、そのファイルにリストされているユーザーは編集できなくなります crontab
. もしも cron.allow
存在する場合、そこにリストされているユーザーのみがcrontabを編集できます。 両方のファイルが存在し、それぞれに同じユーザーがリストされている場合、 cron.allow
ファイルは上書きされます cron.deny
そして、ユーザーは自分の crontab
.
たとえば、すべてのユーザーへのアクセスを拒否してから、ユーザー ishmael へのアクセスを許可するには、次のコマンドシーケンスを使用できます。
- sudo echo ALL >>/etc/cron.deny
- sudo echo ishmael >>/etc/cron.allow
まず、追加してすべてのユーザーをロックアウトします ALL
に cron.deny
ファイル。 次に、ユーザー名をに追加します 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
どちらかでない限り 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で自動化できます。