Linux – cron の使い方

目次

概要

本記事では、特定の時間や間隔でコマンドやスクリプトを実行する cron について解説します。

cron

cron は、Unix 系オペレーティングシステムでタスクを定期的に実行するためのデーモンです。 システム管理者やユーザーは、特定の時間や間隔でコマンドやスクリプトを実行するために cron を使用します。 タスクのスケジュールは crontab ファイルで管理されます。

systemctlcron サービスが起動しているか確認します。

sudo systemctl status cron

インストールされていない場合は、apt でインストールします。

sudo apt-get install cron

crontab

crontab は、cron で定期的に実行するタスクを記述したテキストファイルです。crontabcron 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

これらのフィールドは左から順に以下を表します:

  1. (0 – 59)
  2. (0 – 23)
  3. (1 – 31)
  4. (1 – 12)
  5. 曜日(0 – 7、0 および 7 は日曜日)
  6. user: 実行するユーザー (システムの crontab のみ)
  7. command: 実行するコマンド

フィールドの指定方法

  1. ワイルドカード:

    • フィールドに * を指定すると、そのフィールドのすべての値が対象となります。
    • 例: * * * * * – 毎分コマンドが実行されます。
  2. 範囲指定:

    • フィールドに B-E を指定すると、B から E の範囲のすべての値が対象となります。
    • 例: 0-10 * * * * – 毎時 0 分から 10 分の間にコマンドが実行されます。
  3. リスト指定:

    • 複数の値をカンマで区切って指定することができます。
    • 例: 0,15,30,45 * * * * – 毎時 0 分、15 分、30 分、45 分にコマンドが実行されます。
  4. ステップ値:

    • スラッシュ / を使ってステップ値を指定することができます。
    • 例: */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 コマンド

crontabcrontab の内容を管理するコマンドです。

  • 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

この例では、nekobeanjohn のみが cron ジョブを使用できます。

/etc/cron.deny ファイル

/etc/cron.deny ファイルには、cron ジョブの使用を禁止するユーザーのリストが含まれています。このファイルが存在する場合、リストに含まれるユーザーは cron ジョブを使用できません。

使用例:

/etc/cron.deny

doe
smith

この例では、doesmithcron ジョブを使用できません。

動作の優先順位

  • cron.allow ファイルが存在する場合、その内容が優先されます。リストに含まれていないユーザーは cron ジョブを使用できません。
  • cron.allow ファイルが存在せず、cron.deny ファイルが存在する場合、cron.deny に含まれるユーザーのみが cron ジョブを使用できません。
  • どちらのファイルも存在しない場合、すべてのユーザーが cron ジョブを使用できます。
  • cron.allowcron.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 に記録されます。これらのログファイルを確認することで、ジョブが正しく実行されているかどうかを確認できます。

コメント

コメントする

目次