初心者のためのLinuxにおけるCronの使い方ガイド

Cron Guide 00 Featured Image

Cronは、コンピュータ上でコマンドの実行を管理・スケジュールするシンプルなUNIXユーティリティです。これは1987年にポール・ヴィクシーによって最初に開発され、それ以来、Linuxベースのオペレーティングシステムにとって、管理者とユーザーの両方にとって非常に重要なツールとなっています。

現在では、Linuxシステムに簡単にインストールできるさまざまなCronの実装や再作成があります。それらの違いにもかかわらず、これらのプログラムはすべて同じヴィクシー・クロンクラの系譜を共有しています。

このため、この記事では、オリジナルのヴィクシー・クロンクラがどのように機能するか、その構文、およびLinuxシステムでタスクをスケジュールする方法についての基本的な概要を提供することを目的としています。

目次

  • Cronはどのように機能しますか?
  • Crontab:Cronの中心
  • システムCrontab
  • cronアクティビティのレビュー
  • よくある質問

こちらも読んでみてください:LinuxでのCronジョブの簡単な作成方法

Cronはどのように機能しますか?

Cronは非常にシンプルなUNIXユーティリティです。これは2つの部分で機能します。Cronは、システムを最初に起動したときに開始されるバックグラウンドプロセスとして最初に実行されます。

そこから、毎分特定のファイルを読み取ります。このファイルには、実行したい各スクリプトまたはプログラムの時間コードとファイルパスからなるコマンドのリストが含まれています。

Cron Guide 03 Sample Crontab

このアプローチにより、Cronは大規模なシステムで非常に柔軟になります。たとえば、Cronieのような現代のCron実装は、そのマシンが複数のユーザーをホストしていても、Cronの単一インスタンスのみを実行します。

Cron Guide 04 Local Crontab

Cronieは、システムにインストールされた各ユーザーにローカルのCrontabを提供することでこれを可能にします。したがって、CronはCrontabの所有者、そのユーザーの権限レベル、およびCrontab内のコマンドを知る必要があるだけです。

これは、システムをより効率的にするだけでなく、メモリ内で実行される特権プログラムの数を減らすことによって、より安全になります。

Crontab:Cronの中心

すべてのCron実装は、何らかの形式のCrontabを使用します。これは、特定のユーザーのためにCronが実行するすべてのコマンドを含むシンプルなテキストファイルです。上記のように、システム内の各ユーザーは自分のCrontabを持っています。これを表示するには、次のコマンドを実行します:

crontab -l

Cron Guide 05 List Crontab

これにより、現在のユーザーのCrontabの内容が標準出力に印刷されます。これにより、そのユーザーのためにCronが実行しているコマンドを迅速に確認するのに非常に役立ちます。

編集するには、次のコマンドを実行する必要があります:

crontab -e

これにより、Cronはデフォルトのテキストエディタを実行し、その中にCrontabファイルをロードします。これにより、Crontabファイルを編集できるようになります。

Cron Guide 06 Crontab Editor

こちらも読んでみてください:SystemdタイマーをCronの代替として使用する方法

Crontabの構文

Crontabファイルの構文は非常にシンプルです。このファイル内の1行は、その特定のユーザーのために実行する必要がある対応するコマンドを示します。Crontabコマンドの一般的な形は次のようになります:

m h d mon dow [flags]command

時間間隔は5つの数字のフィールドであり、Cronにコマンドをどれくらいの頻度で実行したいかを伝えます。これは、すべてのCron実装のコア機能であり、Cronが反復タスクを処理する方法について特定かつ柔軟に対応できるようにします。

  • m = 分 (0-59の範囲)
  • h = 時間 (0-23の範囲)
  • d = 月の日 (1-31の範囲)
  • mon = 月 (1-12の範囲)
  • dow = 週の日 (0-6の範囲。0は日曜日)

flagsフィールドは、単一のコマンドに対するCronの動作を変更するオプションのセットです。たとえば、-nオプションを含めることで、Cronがシステムメールを送信するのを防ぐことができます。

commandフィールドは、Cronが設定された間隔で実行するコマンドです。これは、あなたが書いたシェルスクリプトか、フラグ付きのプログラムのパスのいずれかです。

Cron Guide 07 Crontab Line

これらすべてを1つのCrontab行で組み合わせて、タスクの特定の時間間隔を作成できます。たとえば、7月24日の午前2時30分にUbuntuシステムでスクリプトを実行するには、次のCrontab行を書くことができます:

302247*/home/$USER/myscript.sh

Cron Guide 08 Highly Specific Crontab

注意:異なるCronジョブが重複しないようにするために、一般的でない分数(11, 27, 34など)でCronジョブを実行することが推奨されます。

ショートコード

Crontabでは、エントリを読みやすくするためにいくつかのショートコードを使用できます。

  • @reboot – 一度、起動時に実行
  • @yearly – 年に一度、 “0 0 1 1 *”で実行。
  • @annually – @yearlyと同じ
  • @monthly – 月に一度、 “0 0 1 ”で実行
  • @weekly – 週に一度、 “0 0 0”で実行
  • @daily – 一日に一度、 “0 0 *”で実行
  • @midnight – @dailyと同じ
  • @hourly – 一時間に一度、 “0 ”で実行

たとえば:

@daily ramces /home/ramces/.scripts/file-backup.sh

@rebootショートコードを使用することで、起動時に実行するスクリプトを作成できます:

@reboot /home/ramces/.scripts/bootup.sh

これは、マシンをオンにしたときにコマンドがすぐに実行されることを確保する方法を作成したい場合に非常に役立ちます。

注意:システム設定によっては、@rebootショートコードが意図した通りに機能しない場合があります。

システムCrontabs

Cronのもう一つの素晴らしい機能は、定期的なシステム全体のタスクを管理できることで、root Crontabファイルを作成することも可能です。これは、システムメンテナンスと更新を自動化したい場合に非常に役立ちます。

root Crontabを作成するには、コマンドにsudoを使用するか、rootアカウントにログインします:

sudo crontab -e

Cron Guide 10 Root Crontab Editor

システムCrontabは、ユーザーのCrontabとほぼ同じ形式に従います。ただし、2つの主な違いは、root Crontabはシステム内の任意のユーザーとしてコマンドを実行できる点です:

m h d mon dow user [flags]"command"

これを知っていると、同じCrontab内でユーザーとrootレベルの繰り返しコマンドの両方を作成できるようになります:

302 sun root /bin/apt update  
305* ramces /home/ramces/.scripts/file-backup.sh

この方法を使用すると、ファイルの権限を保持しながら、実行したいコマンドを編集できる単一の場所を持つことができます。

Cron Guide 11 Crontab Specific Format

こちらも読んでみてください:LinuxにおけるSudoersファイルの編集方法と理由

別のユーザーとしてCronエントリを編集する

rootユーザーとしてCrontabを編集するのではなく、別のユーザーとしてCronジョブをスケジュールしたい場合も、-uフラグを使用できます。

sudo crontab -u username -e

たとえば、「www-data」ユーザーとしてCronジョブを実行するには、次のコマンドを使用します:

sudo crontab -u www-data -e

こちらも読んでみてください:Linuxでターミナルの出力をファイルに保存する方法

cronアクティビティのレビュー

特定のコマンドやスクリプトを実行する準備が整ったにもかかわらず、それが実行されたことを確認したい場合もあるでしょう。コマンドが実行されると、Cronはそのコマンドの所有者にメールを送信します。これは「MAILTO」変数で変更できます。

cron-mailto-variable

[email protected]を追加すると、すべてのCronジョブレポートが指定されたメールに送信されます。この変数は通常、Crontab編集画面の一番上に見つかります。ただし、そこにない場合は、変数を追加すれば期待通りに機能します。

複数のメールアドレスはカンマで区切ることができます。異なるコマンドを別の場所にメール送りたい場合は、そのコマンドのすぐ上にMAILTOコマンドを追加できます。そのMAILTOの後のコマンドは新しいアドレスにメールされます。MAILTO=を空白にすると、通知はCronエントリの所有者に送られます。

メールを受け取りたくない場合は、Cronログも確認できます。ほとんどのシステムでは、Cronログにアクセスするにはスーパーユーザー権限が必要です。Cronログは「/var/log」にあります。cronまたはsyslogファイルには、実行されたCronエントリのログが表示されます。

sudogrep crontab syslog

よくある質問

なぜ私のCronコマンドは毎分実行されているのか、一時間に一度ではなく?

これは、Crontabを管理する際の最も一般的な落とし穴の1つです。デフォルトでは、時間コードにアスタリスク値を追加すると、その値のすべてのインスタンスで実行されることを意味します。たとえば、0 12 * * *の値は、Cronに12:00 PMに1回コマンドを実行したいことを伝えます。

しかし、多くの初心者は同じ時間コードを* 12 * * *、つまり12:00 PMから12:59 PMの間は毎分コマンドが実行されることを意味します。このため、コマンドが一度だけ実行されるように、分のフィールドには0を書くことが良い習慣です。

Cronに使用できる他のオプションはありますか?

-nおよびMAILTO変数の他にも、コマンドを厳格に実行するようにプログラムに指示するために-sコマンドを使用できます。このオプションを使用すると、Cronは現在のコマンドが終了するまで、そのコマンドのみを集中して実行します。これは、特定の順序で実行する必要があるコマンドのセットを使用しているマシンでは非常に役立ちます。

また、SHELL変数を使用して、Cronがコマンドに異なるシェルを使用するようにすることもできます。たとえば:SHELL=/bin/ksh

画像クレジット: Unsplash