cron
デーモン の crond として稼働しているジョブスケジューラ。
crond は毎分ごとに、crontab ファイルの設定に従って実行すべきジョブがあるかを判定、実行する(crontab で設定できる最小単位は 1 分)。
cron を利用することで、指定した時間や間隔でコマンドやスクリプトをスケジューリングすることができる。
crontab ファイル
cron table
crontab ファイルには、cron ジョブが記載される。
-
ユーザごと
/var/spool/cron/ユーザ名/var/spool/cron/crontabs/ユーザ名- エディタで 直接編集しない(
$ crontab -eを使用する)
-
システム全体
/etc/crontab-
/etc/cron.d/(ディレクトリ) - エディタで 直接編集する
crontab ファイルの書式は以下のように 小さい単位から大きい単位 の順に記述する。
分 時 日 月 曜日 コマンド
分 時 日 月 曜日 ユーザ名 コマンド
| 設定項目 | 指定可能な範囲 |
|---|---|
| 分 |
0 ~ 59
|
| 時 |
0 ~ 23
|
| 日 |
1 ~ 31
|
| 月 |
1 ~ 12
|
| 曜日 |
0 ~ 7 (0 または 7:日曜日) |
| 特殊文字 | 意味 |
|---|---|
* |
全ての値* * * * *:毎分実行 |
, |
複数指定0,30 * * * *:毎時 0 分と 30 分 |
- |
範囲指定10-15 * * * *:毎時 10 分 ~ 15 分の間(10, 11, 12, 13, 14, 15分)0 12 1-5 * *:毎月 1 日 ~ 5 日 |
/ |
間隔指定*/5 * * * *:5 分ごと |
0 3 * * * myscript.sh
* * * * * myscript.sh
/etc/cron.allow / /etc/cron.deny
ユーザが cron ジョブを実行できるかどうかを制御する設定ファイル。
-
/etc/cron.allow-
cronジョブを実行できるユーザを指定する
-
-
/etc/cron.deny/etc/cron.allowがない場合にのみ使用される-
cronジョブの実行を禁止するユーザを指定する
$ crontab
cron ジョブ(スケジュールされたタスク)を管理するためのコマンド。
特にユーザごとの crontab(/var/spool/cron/)を編集するために利用される。
$ crontab -e コマンド実行すると、crontab ファイルが規定のエディタによって開かれるため、内容を編集することでジョブを設定することができる。
エディタは 環境変数 $VISUAL または $EDITOR に設定されたものが起動される(nano、vim など)。
$ crontab -e
各ユーザが $ crontab -e で編集する内容は、内部的には /var/spool/cron/crontabs/ユーザ名 に保存される(システムによっては /var/spool/cron/ユーザ名 になることもある)。
ファイルの名前にユーザ名が使用されることからもわかるように、crontab ファイルへの編集は各ユーザごとに独立しており、他のユーザのジョブには影響しない。
$ crontab -l
$ crontb -r
anacron
cron 同様に設定ファイルでスケジュールされたタスクを実行するジョブスケジューラ。
厳密には cron のようにバックグランドで常駐するタイプのデーモンではなく、呼び出された時に一度だけジョブのチェックを行い、必要なジョブを実行するプログラム。
crond デーモンもしくは systemd-timer によって起動される。
cron は予定された時刻にシステムが起動していない場合、ジョブの実行をスキップするのに対して、anacron は実行できなかったジョブをスキップせず、次回起動時にまとめて実行する。
/etc/anacrontab で設定を行う。
設定ファイル
anacron は /etc/anacrontab の設定に従い、以下のディレクトリに配置されたコマンドを実行する。
| ディレクトリ | 説明 |
|---|---|
/etc/cron.hourly/ |
1 時間ごとに実行するスクリプトを配置 |
/etc/cron.daily/ |
1 日ごとに実行するスクリプトを配置 |
/etc/cron.weekly/ |
1 週間ごとに実行するスクリプトを配置 |
/etc/cron.monthly/ |
1 ヶ月ごとに実行するスクリプトを配置 |
atd
指定したコマンドを指定した時刻に 1 回限りで実行するデーモン。
/etc/at.allow / /etc/at.deny
ユーザが at ジョブを実行できるかどうかを制御する設定ファイル。
-
/etc/at.allow-
atジョブを実行できるユーザを指定する
-
-
/etc/at.deny/etc/at.allowがない場合にのみ、利用される-
atジョブの実行を 禁止するユーザを指定する
どちらもない場合には、一般ユーザに許可されないt root ユーザのみが実行できる。
$ at
指定したコマンドを 1 回限りで実行する。
$ crontab が定期的なジョブ実行を行うの対して、$ at は 1 回だけ指定した時間で実行したい場合に利用される。
$ at コマンドで追加されたジョブは atd (/usr/sbin/atd) デーモンによって実行される。
$ at コマンドを実行すると、標準入力 からジョブ(実行コマンド)を受け付けるモードに入る。
$ at 時間 日付
対話モードになったら、実行させたいコマンドを入力する。Ctrl + D キーで入力を終了する。
$ at -l
$ at -c ジョブID
$ at -d ジョブID
$ at -r ジョブID
$ atq
$ atq
$ atrm
$ atrm ジョブID
$ batch
システムがアイドル状態(負荷が少ない状態)の時にジョブを実行させる。
時刻を指定することはできない。
$ batch
$ batch コマンドを実行すると、登録するジョブを入力するための対話が開始される。実行したいコマンドが入力し終えたら、Ctrl + D を同時押しで対話を終了することができる。
$ batch は 標準入力 からジョブを受け取るため、以下のようにすることでスクリプト実行をジョブとして登録することができる。
$ echo "bash ./myscript.sh" | batch
また $ batch は $ at と同様に atd デーモンによって管理され、以下のような $ at と共通の機能を持つ。
-
$ atqで登録済みジョブを確認できる -
$ atrmで登録済みジョブを削除できる -
/etc/at.denyで実行を禁止するユーザを登録することができる
タイマーユニット
systemd のタイマーユニット(*.timer)は、cron と同様に定期的なタスクを実行するための機能。
cron よりも柔軟で管理しやすいメリットがあるが、使い方が難しい。
ジョブを実行する cron とは異なり、ターマーユニットは systemd のサービス (*.service) をスケジュール実行する。
通常の systemd タイマー(/etc/systemd/system/)は root 権限で設定するが、一般ユーザでも ~/.config/systemd/user/ を使えばユーザ単位での systemd タイマーを設定できる。
.timer ユニットと .service ユニット から構成される。
-
.timerユニット- タイマーの設定
- いつ、どのように実行するかを定義する
-
.serviceユニット- 実行する処理
- 実際に実行するコマンドやスクリプトを定義する
cron では 1 つのファイル(crontab)でスケジュールとコマンドを設定するが、systemd では スケジュール(.timer)とコマンド(.service)を分けることで管理しやすくなっている。