序章


Linuxマシンでバックグラウンドでタスクを実行する最も標準的な方法の1つは、cronジョブを使用することです。 これらは、VPSでのタスクのスケジュール設定や、さまざまなメンテナンス関連のジョブの自動化に役立ちます。 「cron」自体は、バックグラウンドで実行されるデーモン(またはプログラム)です。 実行されるさまざまなジョブのスケジュールは、「crontab」と呼ばれる構成ファイルにあります。

インストール


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

Ubuntu / Debianの場合:

sudo apt-get update
sudo apt-get install cron

Cent OS / Red Hat Linuxの場合:

sudo yum update
sudo yum install vixie-cron crontabs

バックグラウンドでも実行されることを確認する必要があります。

sudo /sbin/chkconfig crond on
sudo /sbin/service crond start

構文


実行したいタスクの例を次に示します。

5 * * * * curl http://www.google.com

crontabに配置するさまざまなジョブの構文は、威圧的に見えるかもしれません。 読み方を知っていれば、実際には非常に簡潔で解析しやすいものです。 すべてのコマンドは次のように分類されます。

  • スケジュール
  • 指示

コマンドは、コマンドラインで通常実行する実質的にすべてのコマンドにすることができます。 構文のスケジュールコンポーネントは、次の順序でスケジュールするための5つの異なるオプションに分けられます。

  • 時間
  • 月の日
  • 曜日


cronの設定中に発生する可能性のあるいくつかの一般的なスケジュールの例のリストを次に示します。

毎分コマンドを実行するには:

* * * * *

正時に12分ごとにコマンドを実行するには:

12 * * * *

プレースホルダーごとに異なるオプションを使用することもできます。 15分ごとにコマンドを実行するには:

0,15,30,45 * * * *

毎日午前4時にコマンドを実行するには、次を使用します。

0 4 * * *

毎週火曜日の午前4時にコマンドを実行するには、次を使用します。

0 4 * * 2

スケジュールで除算を使用できます。 0、15、30、45をリストする代わりに、次を使用することもできます。

*/4 2-6 * * *

2-6」の範囲に注意してください。 この構文は、午前2時から午前6時の間にコマンドを実行します。

スケジューリング構文は非常に強力で柔軟性があります。 想像できるほぼすべての時間を表現できます。

構成


スケジュールが決まったら、実行したいジョブがわかったら、デーモンがそれを読み取れるように、それを配置する場所が必要になります。 いくつかの異なる場所がありますが、最も一般的なのはユーザーのcrontabです。 思い出してください。これは、cronが実行するジョブのスケジュールを保持するファイルです。 各ユーザーのファイルは/var/spool/cron/crontabにありますが、直接編集することはできません。 代わりに、crontabコマンドを使用することをお勧めします。

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

crontab -e

これにより、テキストエディタが表示され、各ジョブのスケジュールを新しい行に入力できます。

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

crontab -l

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

crontab -r

特権ユーザーの場合は、crontab -u <user> -eを指定して、別のユーザーを編集できます。

出力


実行されるすべてのcronジョブについて、そのユーザーに関連付けられているユーザーの電子メールアドレスは、ログファイルまたは/ dev / nullに送信されない限り、出力を電子メールで送信します。 crontabの上部に「MAILTO」設定を指定すると、電子メールアドレスを手動で指定できます。 次の例を使用して、実行するシェル、cronバイナリを検索するパス、およびホームディレクトリを指定することもできます。

まず、crontabを編集しましょう。

crontab -e

次に、次のように編集します。

SHELL=/bin/bash
HOME=/
MAILTO=”[email protected]”
#This is a comment
* * * * * echo ‘Run this command every minute’

この特定のジョブは、「このコマンドを毎分実行する」と出力します。 その出力は、私が指定した「example @digitalocean.com」電子メールアドレスに毎分電子メールで送信されます。 明らかに、それは理想的な状況ではないかもしれません。 前述のように、出力をログファイルまたは空の場所にパイプ処理して、出力が記載された電子メールを受け取らないようにすることもできます。

ログファイルに追加するには、次のように簡単です。

* * * * * echo ‘Run this command every minute’ >> file.log

注:「>>」はファイルに追加されます。

空の場所にパイプする場合は、/dev/nullを使用します。 これは、バックグラウンドで実行および実行されるPHPスクリプトです。

* * * * * /usr/bin/php /var/www/domain.com/backup.php > /dev/null 2>&1

アクセスの制限


/etc/cron.allowおよび/etc/cron.denyファイルを使用すると、cronへのアクセスを簡単に制限できます。 ユーザーを許可または拒否するには、必要なアクセスに応じて、ユーザー名をこれらのファイルの1つに配置する必要があります。 デフォルトでは、ほとんどのcronデーモンは、これらのファイルの1つが存在しない限り、すべてのユーザーがcronにアクセスできると想定します。 すべてのユーザーへのアクセスを拒否し、ユーザーtdurdenへのアクセスを許可するには、次のコマンドシーケンスを使用します。

echo ALL >>/etc/cron.deny
echo tdurden >>/etc/cron.allow

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

特別な構文


管理を少し簡単にするために、crontabファイルで使用できるいくつかの省略コマンドがあります。 これらは、指定された同等の数値スケジュールの重要なショートカットです。

  • @hourly0 * * * *の省略形
  • @daily0 0 * * *の省略形
  • @weekly0 0 * * 0の省略形
  • @monthly0 0 1 * *の省略形
  • @yearly0 0 1 1 *の省略形

@rebootは、起動時にコマンドを1回実行します。

注:すべてのcronデーモンがこの構文(特に古いバージョン)を解析できるわけではないため、信頼する前に、それが機能することを再確認してください。

起動時に実行されるジョブを作成するには、crontabファイル(crontab -e)を編集して、次のような行をファイルに配置します。

@reboot echo "System start up"

この特定のコマンドが実行され、crontabで指定されたユーザーに電子メールで送信されます。