cron
定期的にジョブを実行する cron は、スケジュール管理するデーモンである crond と、スケジューリングを編集する crontab コマンドから構成される。crond は 1 分ごとに起動され、crontab ファイルを調べて、実行すべきスケジュールが存在すればそのジョブを実行する。
ユーザーの crontab
ユーザーの crontab ファイルは /var/spool/cron/[user-name] もしくは /var/spool/cron/crontab/[user-name] という形で配置されている。
$ sudo cat /var/spool/cron/ec2-user
15 23 * * * /usr/bin/logger 'test'
cron ジョブを設定するには -e オプションを指定する。
$ crontab -e
-l オプションで設定されている cron ジョブの一覧を表示できる。
$ crontab -l
15 23 * * * /usr/bin/logger 'test'
-r で設定されている全ての cron ジョブが削除可能。
$ crontab -r
$ crontab -l
no crontab for ec2-user
「15 23 * * * /usr/bin/logger ‘test’」の書式は左から、分、時、日、月、曜日、コマンドとなっており、この例だと、毎日 23:15 に logger コマンドを実行する形となる。
感覚を指定することも可能であり、以下の例だと、5 分毎にコマンドを実行する。
システムの crontab
システム用の crontab ファイルは /etc/crontab という形で配置されている。
/etc/crontab は一般的に /etc/cron.* ディレクトリに配置されるファイルを呼び出すようになっており、/etc/crontab ファイルには、実行ユーザー名を指定するフィールドが加わる。
$ cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
cron 関連ファイル及びディレクトリは以下のもの。
$ ls -ld /etc/cron*
drwxr-xr-x 2 root root 4096 5月 2 22:53 /etc/cron.d
drwxr-xr-x 2 root root 4096 4月 13 00:08 /etc/cron.daily
-rw------- 1 root root 0 9月 28 2016 /etc/cron.deny
drwxr-xr-x 2 root root 4096 1月 6 2012 /etc/cron.hourly
drwxr-xr-x 2 root root 4096 1月 6 2012 /etc/cron.monthly
-rw-r--r-- 1 root root 457 1月 6 2012 /etc/crontab
drwxr-xr-x 2 root root 4096 1月 6 2012 /etc/cron.weekly
cron.daily などのディレクトリには 1 日 1 度事項されるジョブが記述されたファイルが配置されている。
anacron
cron は 1 分毎に実行スケジュールをチェックするが、指定された時刻にシステムが起動していなかった場合、そのジョブは実行されなくなってしまう。これおを防ぐために anacron という仕組みが用意されている。
anacron を使うとシステムが停止した際に経過してしまったスケジュールを実行することが可能で、/etc/anacrontab にスケジューリングが記載されている。
$ sudo cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
RANDOMDELAY というのがランダムに遅らせる最大値 (分) となり、STARTHOURS では 3 時から 22 時の間だけ実行される、などを規定している。
例えば下から 3 行目の設定では、
- 前回の実行から 1 日以上経過していればジョブを実行する
- 実行するまで 5 分待機する (これに RANDOM_DELAY で指定された範囲でランダムに遅らせられる)
- 実行日を cron.daily ファイルに記録する
- nice コマンド尽きて run-parts コマンドを実行する
なお、RHEL 6 や CentOS 6 以降であれば、日次、週次、月次のジョブは anacron が処理し、それ以外のジョブは cron が処理するように設定されている。
at コマンド
cron が定期的に繰り返し実行するジョブを扱うのに対し、at コマンドは 1 回限りの実行スケジュールを扱う。
at コマンドによるスケジュールを実施するには、at デーモン (atd) が動作している必要がある。
-d: 予約中のジョブをジョブ番号で指定して削除
-l: 予約中のジョブを表示する
-f: コマンドを記述したファイルを指定する
$ at 5:00 tomorrow
at> /usr/bin/logger 'at test'
at> <EOT>
job 1 at 2018-06-06 05:00
$ at -l
1 2018-06-06 05:00 a ec2-user
$ at -d 1
$ at -l
日次の指定の仕方については、22:00 、10pm などの他に、noon 、midnight 、today 、tomorrow 、now + 3 days 、10pm + 2 weeks という指定の仕方もできる。
また、at -l,-d はそれぞれ atq 及び atrm コマンドで代用できる。
$ at -f my_jobs 23:30
job 2 at 2018-06-05 23:30
$ atq
2 2018-06-05 23:30 a ec2-user
$ atrm 2
$ atq
cron と at のアクセス制御
cron のアクセス制御
cron を利用するユーザーを制限するには、/etc/cron.allow 及び/etc/cron.deny を用いる。
これらは以下の順に評価される。
- /etc/cron.allow があれば、そこに記載されたユーザーのみが cron を利用できる
- /etc/cron.allow がなければ /etc/cron.deny を参照し、/etc/cron.deny に記載されていないユーザー全てが cron を利用できる
- どちらもなければ全てのユーザーが cron を利用できる
at のアクセス制御
at コマンドを利用するユーザーを制御するには、/etc/at.allow 及び /etc/at.deny を用いる。
これらは以下の順で評価される。
- /etc/at.allow があれば、そこに記載されたユーザーのみが at を利用できる
- /etc/at.allow がなければ /etc/at.deny を参照し、/etc/at.deny に記載されていないユーザー全てが at を利用できる
- どちらもなければ** root ユーザーのみ**が at を利用できる