概要
本記事では、特定の時間や間隔でコマンドやスクリプトを実行する cron
について解説します。
cron
cron
は、Unix 系オペレーティングシステムでタスクを定期的に実行するためのデーモンです。
システム管理者やユーザーは、特定の時間や間隔でコマンドやスクリプトを実行するために cron
を使用します。
タスクのスケジュールは crontab
ファイルで管理されます。
systemctl
で cron
サービスが起動しているか確認します。
sudo systemctl status cron
インストールされていない場合は、apt
でインストールします。
sudo apt-get install cron
crontab
crontab
は、cron
で定期的に実行するタスクを記述したテキストファイルです。crontab
は cron table の略で、cron デーモンによって読み込まれ、指定されたスケジュールに基づいてコマンドやスクリプトを実行します。ファイルの編集は同じ名前の crontab
コマンドで行います。
crontab の保存場所
crontab
は以下の場所に保存されています。直接編集する代わりに、通常は crontab
コマンドを使用して編集します。
ユーザーの crontab
: /var/spool/crontab/username
システムの crontab
: /etc/crontab
以下は、cron
に関するすべての設定ディレクトリおよびファイルを整理したテーブルです。
cron の設定ディレクトリおよびファイル
ディレクトリ/ファイル | 説明 |
---|---|
/etc/crontab |
システム全体の cron ジョブを設定するファイル |
/etc/cron.d/ |
他の cron 設定ファイルを格納するディレクトリ |
/etc/cron.daily/ |
毎日実行されるスクリプトを格納するディレクトリ |
/etc/cron.weekly/ |
毎週実行されるスクリプトを格納するディレクトリ |
/etc/cron.monthly/ |
毎月実行されるスクリプトを格納するディレクトリ |
/etc/cron.hourly/ |
毎時実行されるスクリプトを格納するディレクトリ |
/var/spool/cron/crontabs/ |
各ユーザーの crontab ファイルを格納するディレクトリ。通常、直接編集しません。 |
/var/log/cron または /var/log/syslog |
cron ジョブのログファイル。システムによって異なります。 |
crontab の書式
ユーザーの
crontab
* * * * * command
システムの
crontab
* * * * * user command
これらのフィールドは左から順に以下を表します:
- 分(0 – 59)
- 時(0 – 23)
- 日(1 – 31)
- 月(1 – 12)
- 曜日(0 – 7、0 および 7 は日曜日)
- user: 実行するユーザー (システムの
crontab
のみ) - command: 実行するコマンド
フィールドの指定方法
ワイルドカード:
- フィールドに
*
を指定すると、そのフィールドのすべての値が対象となります。 - 例:
* * * * *
– 毎分コマンドが実行されます。
- フィールドに
範囲指定:
- フィールドに
B-E
を指定すると、B
からE
の範囲のすべての値が対象となります。 - 例:
0-10 * * * *
– 毎時 0 分から 10 分の間にコマンドが実行されます。
- フィールドに
リスト指定:
- 複数の値をカンマで区切って指定することができます。
- 例:
0,15,30,45 * * * *
– 毎時 0 分、15 分、30 分、45 分にコマンドが実行されます。
ステップ値:
- スラッシュ
/
を使ってステップ値を指定することができます。 - 例:
*/10 * * * *
– 10 分おきにコマンドが実行されます。
- スラッシュ
特殊な時間指定
タスクの実行間隔の指定方法として、以下の特殊な時間指定が使用できます。
特殊指定 | 説明 | 例 |
---|---|---|
@reboot |
システムが起動したときに実行 | @reboot /path/to/your/command |
@yearly |
毎年 1 月 1 日の午前 0 時に実行 | @yearly /path/to/your/command |
@annually |
@yearly と同様 |
@annually /path/to/your/command |
@monthly |
毎月 1 日の午前 0 時に実行 | @monthly /path/to/your/command |
@weekly |
毎週日曜日の午前 0 時に実行 | @weekly /path/to/your/command |
@daily |
毎日午前 0 時に実行 | @daily /path/to/your/command |
@midnight |
@daily と同様 |
@midnight /path/to/your/command |
@hourly |
毎時 0 分に実行 | @hourly /path/to/your/command |
crontab コマンド
crontab
は crontab
の内容を管理するコマンドです。
crontab の編集:
crontab -e
ユーザーの
crontab
ファイルを編集します。crontab の一覧表示:
crontab -l
現在のユーザーの
crontab
エントリを表示します。crontab の削除:
crontab -r
現在のユーザーの
crontab
エントリを削除します。別のファイルから crontab を設定:
crontab filename
指定したファイルの内容を現在のユーザーの
crontab
として設定します。
crontab の設定例
以下は、実際の crontab
エントリの例です。
毎日午前 2 時にバックアップスクリプトを実行する:
# 分 時 日 月 曜日 0 2 * * * /path/to/backup.sh
毎週月曜日の午前 3 時にレポートを生成する:
# 分 時 日 月 曜日 0 3 * * 1 /path/to/report.sh
毎日午後 1 時から午後 5 時までの毎時 30 分にログをクリアする:
# 分 時 日 月 曜日 30 13-17 * * * /path/to/clear_logs.sh
毎月 1 日の午前 1 時にシステムメンテナンスを実行する:
# 分 時 日 月 曜日 0 1 1 * * /path/to/maintenance.sh
ログの確認
cron
の実行結果やエラーは、通常システムのログファイルに記録されます。以下のコマンドを使用してログを確認できます。
syslog の確認:
tail -f /var/log/syslog
cron 専用のログの確認:
tail -f /var/log/cron
cron を利用できるユーザーを制限する
/etc/cron.deny
と /etc/cron.allow
ファイルは、Linux システムで cron
ジョブ(定期的なタスクのスケジュール管理)のアクセス制御を行うための設定ファイルです。これらのファイルを使用して、特定のユーザーが cron
ジョブを使用できるかどうかを制御できます。
/etc/cron.allow
ファイル
/etc/cron.allow
ファイルには、cron
ジョブの使用を許可するユーザーのリストが含まれています。このファイルが存在する場合、リストに含まれていないユーザーは cron
ジョブを使用できません。
使用例:
/etc/cron.allow
nekobean
john
この例では、nekobean
と john
のみが cron
ジョブを使用できます。
/etc/cron.deny
ファイル
/etc/cron.deny
ファイルには、cron
ジョブの使用を禁止するユーザーのリストが含まれています。このファイルが存在する場合、リストに含まれるユーザーは cron
ジョブを使用できません。
使用例:
/etc/cron.deny
doe
smith
この例では、doe
と smith
が cron
ジョブを使用できません。
動作の優先順位
cron.allow
ファイルが存在する場合、その内容が優先されます。リストに含まれていないユーザーはcron
ジョブを使用できません。cron.allow
ファイルが存在せず、cron.deny
ファイルが存在する場合、cron.deny
に含まれるユーザーのみがcron
ジョブを使用できません。- どちらのファイルも存在しない場合、すべてのユーザーが
cron
ジョブを使用できます。 cron.allow
とcron.deny
の両方が存在する場合、cron.allow
が優先されます。
anacron
anacron
は、cron
のように定期的なジョブのスケジュール管理を行うツールです。しかし、cron
とは異なり、anacron
はシステムがシャットダウンされていたり、スリープ状態だったりしてもジョブの実行を保証します。指定されたジョブが最後に実行されるべきだった時間以降にシステムが再起動された場合、anacron
はそのジョブを再実行します。
anacrontab
anacron
の設定ファイルは通常 /etc/anacrontab
にあります。crontab
と違い編集するコマンドは容易されていないため、エディタで開いて直接編集します。
/etc/anacrontab
の書式
/etc/anacrontab
の各行は次のように構成されています:
期間 遅延 ジョブID コマンド
- 期間: ジョブの実行間隔(日数)。
1
は毎日、7
は毎週、30
は毎月を意味します。 - 遅延: ジョブの実行を開始するまでの遅延時間(分)。
- ジョブ ID: ジョブの一意識別子。ログに表示される。
- コマンド: 実行するコマンド。
設定例
以下は /etc/anacrontab
のデフォルトの設定です:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root
# 日時ジョブ
1 5 cron.daily run-parts --report /etc/cron.daily
# 週次ジョブ
7 10 cron.weekly run-parts --report /etc/cron.weekly
# 月次ジョブ
@monthly 15 cron.monthly run-parts --report /etc/cron.monthly
- 日次ジョブ: 毎日実行され、システムが起動してから 5 分後に開始されます。
- 週次ジョブ: 毎週実行され、システムが起動してから 10 分後に開始されます。
- 月次ジョブ: 毎月実行され、システムが起動してから 15 分後に開始されます。
run-parts
は、指定されたディレクトリ内のスクリプトを順番に実行するコマンドです。
デフォルトで上記のように設定されているため、/etc/anacrontab
にコマンドを追加する代わりに、以下のディレクトリにスクリプトを配置してもよいです。
/etc/cron.daily
: 毎日実行するスクリプトを配置/etc/cron.weekly
: 毎週実行するスクリプトを配置/etc/cron.monthly
: 毎月実行するスクリプトを配置
anacron の使い方
/etc/crontab
を確認するとわかるように、cron
から anacron
が呼び出されるようになっているので、/etc/anacrontab
に設定するか、/etc/cron.daily
、/etc/cron.weekly
、/etc/cron.monthly
にスクリプトを配置するだけで大丈夫です。
anacron
のジョブをただちに手動で実行する場合は、次のコマンドを使用します:
sudo anacron -f
anacron
のジョブの実行状況は、通常 /var/log/syslog
または /var/log/cron
に記録されます。これらのログファイルを確認することで、ジョブが正しく実行されているかどうかを確認できます。
コメント