スケジュールされたタスクの cron

導入

Cron は、スケジュールされたタスクを実行するためのツールで、指定した時間に繰り返し実行されるタスクを自動的に実行できます。

その中心となるのは、crond と呼ばれる cron デーモンです。これはバックグラウンドで毎分実行され、現時点で実行する必要があるスケジュールされたタスクがあるかどうかを確認します。

以下のコマンドで cron デーモンが正常に動作しているか確認できます。

# Ubuntu / Debian
$ sudo systemctl status cron
# or
$ ps aux | grep cron

# rockyOS / RHEL
$ sudo systemctl status crond
# or
$ ps aux | grep crond

crontab

crond によってチェックされたスケジュールされたタスクは、crontab ファイルに保存されます。このファイルの各行は、タスクをいつ実行するか、実行するコマンドを含む個別のタスクを表します。

crontab は、ユーザーの個人用 crontab とシステムの crontab の 2 つのレベルに分かれています。前者はユーザー自身が編集できますが、後者は root ユーザーのみが編集できます。

システムの crontab は、/etc/crontab (またはディレクトリ /etc/cron.d/) と、一連の特別なディレクトリ (/etc/cron.daily/etc/cron.hourly) に保存されます。 /etc/cron.weekly、および /etc/cron.monthly

crontab 自体もコマンドであり、次のコマンドで既存の cron タスクを確認できます。

# 現在のユーザーの cron タスク
$ crontab -l

# root ユーザーの cron タスク
$ sudo crontab -l

# 指定したユーザーの cron タスク
$ sudo crontab -u [USERNAME] -l

cron タスクの構文

crontab ファイルの各行は cron タスクを表します。これは、スペースまたはタブで区切られた複数のフィールドで構成されます。

cron タスクの基本的な構文は次のとおりです。

minute hour day_of_month month day_of_week command_to_execute

各フィールドの意味は以下のとおりです。

  • 分 (0 ~ 59): コマンドを実行する分を指定します。0 ~ 59 の値を指定できます。0 はコマンドが時間の初めに実行されることを示します。
  • 時間 (0-23): コマンドを実行する時間を 24 時間形式で指定します。たとえば、14 に設定すると、コマンドが午後 2 時に実行されます。
  • day_of_month (1-31): コマンドを実行する日を指定します。月の日数に応じて、1 ~ 31 の任意の値を指定できます。たとえば、1 に設定すると、毎月 1 日にコマンドが実行されます。
  • month (1-12): コマンドを実行する月を指定します。 1 (1 月) から 12 (12 月) までの値を指定できます。たとえば、12 に設定すると、コマンドは 12 月に実行されます。
  • day_of_week (0-6): コマンドを実行する曜日を指定します。 0 (日曜日) から 6 (土曜日) までの値を指定できます。たとえば、5 に設定すると、毎週金曜日にコマンドが実行されます。
  • command_to_execute: cron タスクが実行するアクションを指定します。

crontab ではワイルドカード文字も使用できます。

  • アスタリスク (*): すべての時間単位を表します。たとえば、時間フィールドの*毎時間を意味します。
  • カンマ (,): 同じフィールドに複数の値を指定する場合に使用します。たとえば、day_of_week フィールドの1,3,5は、月曜日、水曜日、金曜日に実行されることを意味します。カンマの前後にスペースを入れることはできないことに注意してください。
  • ハイフン (-): 値の範囲を指定します。たとえば、時間フィールドの9-17は、午前 9 時から午後 5 時までの毎時を意味します。
  • スラッシュ (/): 増分を指定します。たとえば、分フィールドの*/1010 分ごとを意味します。

crontab はいくつかのショートカット文字列も提供します。

  • @reboot は、起動時に指定されたコマンドを 1 回実行します。
  • @year、@annually どちらも、指定されたタスクを毎年 1 月 1 日の午後 12 時に実行します。 0 0 1 1 *を指定するのと同じ
  • @monthly このジョブを毎月 1 回、毎月 1 日の 12:00 に実行します。 0 0 1 * *に相当
  • @weekly このジョブを毎週日曜日の正午に 1 回実行します。 0 0 * * 0に相当
  • @daily、@midnight: どちらも毎日午後 12 時に cronjob を実行します。これは、crontab ファイルで0 0 * * *を指定するのと同じです。
  • @hourly: ジョブを毎正時に実行します。 0 * * * *に相当

crontab ファイルでは、#記号で始まる行はコメントを示します。

以下にいくつかの例を示します。

  • * * * * * cron ジョブを毎分実行します。
  • 0 * * * * cron ジョブを 1 時間ごとに実行します。
  • 0 0 * * * 毎日深夜に cron ジョブを実行します。
  • 0 2 * * * 毎日午前 2 時に cron ジョブを実行します。
  • 0 0 15 * * 毎月 15 日の午前 0 時に cron ジョブを実行します。
  • 0 0 0 12 * 土曜の深夜に cron ジョブを実行します。
  • 0 0 * * 6 月曜日から金曜日まで毎日午後 3 時に cron ジョブを実行します。
  • 0 15 * * 1-5 月曜日から金曜日まで毎日午後 3 時に cron ジョブを実行します。
  • */5 * * * * cron ジョブを 5 分ごとに実行します。
  • 0 8-16 * * * cron ジョブを毎日、毎時間、午前 8 時から午後 4 時まで定刻に実行します。
  • 0 4 * * 2,4 火曜日と木曜日の午前 4 時に cron ジョブを実行します。
  • @reboot は、システムの起動時または crond プロセスの起動時に cron タスクを実行します。

さらに、いくつかの特殊な文字があります。

L は Last を表し、月の日曜日にのみ適用されます。

0 4 L * * command - 毎月末日の午前 4 時
0 4 * * 5L command - 毎月最終金曜日の午前 4 時

Wは平日を意味し、月の最後の営業日であり、月の特定の日にのみ適用されます。

0 4 15W * * command - 毎月 15 日の最も近い営業日 (月曜日から金曜日) の午前 4 時

# は月の数字を表し、曜日にのみ適用されます。

0 4 * * 5#2 - 毎月第 2 金曜日午前 4 時

環境変数

Cron タスクは非対話型、非ログイン シェル環境で実行されます。つまり、コマンドを手動で実行する場合と同じ環境変数にアクセスできない可能性があります。

これは、cron タスクがユーザーまたはシステムの環境変数やパスを自動的に継承しないことを意味します。これにより、cron ジョブが失敗し、実行可能ファイルまたはスクリプトが見つからなくなる可能性があります。回避策は、crontab ファイルに PATH 環境変数を明示的に設定することです。

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

ただし、デバッグを容易にするために、cron タスクでは常に絶対パスを使用することをお勧めします。

PATH環境変数に加えて、SHELL環境変数を設定して cron が使用するシェルを指定することもできます。

SHELL=/bin/sh

上記の例では、cron タスクの実行時に Bash の使用を設定します。

他の環境変数をすべてこの形式で追加します。

result="HELLO WORLD"

上記の例では、環境変数resultに値HELLO WORLDを追加します。

cron タスク管理

個人的なタスク

ユーザーの crontab ファイルを作成または編集するには、次のコマンドを使用します。

# 現在のユーザーの cron タスクを編集する
$ crontab -e

# root ユーザーの cron タスクを編集します
$ sudo crontab -e

# 指定したユーザーの cron タスクを編集します
$ sudo crontab -u [USERNAME] -e

上記のコマンドは、システムのデフォルトのテキスト エディタを開き、ユーザーの crontab ファイルを編集します。

もう 1 つの方法は、cron ジョブをシステムの /etc/cronjob ファイルに手動で追加するか、または /etc/cron.d/ ディレクトリに新しいファイルを作成することです。システムのアップデート中に /etc/cronjob が上書きされる可能性があるため、後者の使用をお勧めします。

上記の 2 つの場所にある crontab ファイルを更新する場合、各タスクは 6 番目のフィールドにユーザー名を追加して、タスクが実行されているユーザー名を示す必要があります。

* * * * * user command

スクリプトを定期的に実行するもう 1 つの方法は、/etc/cron.* ディレクトリを使用し、次のいずれかのディレクトリにスクリプトを保存することです。これにより、root ユーザーとしてタスクを直接実行できます。 (スクリプトを確実に実行するには、スクリプトの実行権限をオンにすることが最善です。)

  • /etc/cron.hourly/
  • /etc/cron.daily/
  • /etc/cron.weekly/
  • /etc/cron.monthly/

cron タスクを追加するには、crontab ファイルに新しい行を追加するだけです。たとえば、バックアップ スクリプトbackup.shが毎日午前3時に実行される場合は、次の内容を追加します。

0 3 * * * /home/linuxiac/backup.sh

編集が完了したら、保存してエディタを終了します。 cron サービスは crontab ファイルを自動的にチェックするため、変更後に cron プロセスを再起動する必要はありません。

また、crontab -eは、ファイルの保存時と終了時に構文を自動的にチェックして、無効な cron タスクを誤って入力することを防ぎます。

cron タスクを削除する場合は、その行を削除するだけです。

すべての cron タスクを削除したい場合は、crontab ファイルを削除するか、コマンド ライン パラメータ -r を使用します。

# プロンプトを表示せずに現在のユーザーの cron タスクをすべて削除します
$ crontab -r

上記のコマンドは、確認プロンプトなしで現在のユーザーの crontab ファイルを削除します (つまり、すべての cron タスクを削除します)。そのため、注意して使用してください。

削除する前に確認プロンプトが必要な場合は、コマンド ライン パラメータ -i を使用できます。

# 現在のユーザーのすべての cron タスクを削除する前に、確認プロンプトが表示されます。
$ crontab -i -r

以下は、root ユーザーとその他のユーザーを削除する cron タスクです。

# root ユーザーの cron タスクをすべて削除します
$ sudo crontab -r

# 特定のユーザーの cron タスクをすべて削除します
$ sudo crontab -u USERNAME -r

システムタスク

システムレベルの cron タスクを作成するには、/etc/crontab ファイルを直接編集する必要があります。

0  2  *  *  * root /usr/bin/find /var/log/myservice -type f -name '*.log' -delete

上記の例では、拡張子.logを持つすべてのファイルを毎日午前 2 時に/var/log/myserviceディレクトリから削除するように設定されています。

その形式とユーザーレベルの cron ファイルの違いの 1 つは、最初に時間を表す 5 つのフィールドの後に、タスクを実行するユーザー アカウント (この場合はroot) を表す追加フィールドがあることです。

/etc/crontab ファイルを直接編集することには 2 つの欠点があります。 (1) 構文チェックが提供されないため、エラーのリスクが増加します。 (2) システム全体に影響を与えるため、使用には十分な注意が必要です。

すべてのシステムレベルの cron タスクをリストするには、以下のすべてのファイルとディレクトリを表示する必要があります。

  • /etc/crontab ファイル
  • /etc/cron.d/ ディレクトリ
  • /etc/cron.daily/ ディレクトリ
  • /etc/cron.hourly/ ディレクトリ
  • /etc/cron.weekly/ ディレクトリ
  • /etc/cron.monthly/ ディレクトリ

cron タスクのログ

cron タスク実行の stdout 出力はログに記録されないため、コマンドまたはスクリプト自体に追加する必要があります。

0 4 * * 5L command -v >> /var/logs/command.log

簡易実行記録、システムログを閲覧できます。 Ubuntu/Debian は/var/log/syslogまたは/var/log/auth.log、RHEL/RHEL は/var/log/cronです。grep コマンドを使用してログをフィルタリングできます。

$ sudo grep -i cron /var/log/syslog /var/log/auth.log

参考リンク


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0