ジョブスケジューリング

June 05, 2018

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  52 22:53 /etc/cron.d  
drwxr-xr-x 2 root root 4096  413 00:08 /etc/cron.daily  
-rw------- 1 root root    0  928  2016 /etc/cron.deny  
drwxr-xr-x 2 root root 4096  16  2012 /etc/cron.hourly  
drwxr-xr-x 2 root root 4096  16  2012 /etc/cron.monthly  
-rw-r--r-- 1 root root  457  16  2012 /etc/crontab  
drwxr-xr-x 2 root root 4096  16  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 を用いる。
これらは以下の順に評価される。

  1. /etc/cron.allow があれば、そこに記載されたユーザーのみが cron を利用できる
  2. /etc/cron.allow がなければ /etc/cron.deny を参照し、/etc/cron.deny に記載されていないユーザー全てが cron を利用できる
  3. どちらもなければ全てのユーザーが cron を利用できる

at のアクセス制御

at コマンドを利用するユーザーを制御するには、/etc/at.allow 及び /etc/at.deny を用いる。
これらは以下の順で評価される。

  1. /etc/at.allow があれば、そこに記載されたユーザーのみが at を利用できる
  2. /etc/at.allow がなければ /etc/at.deny を参照し、/etc/at.deny に記載されていないユーザー全てが at を利用できる
  3. どちらもなければ** root ユーザーのみ**が at を利用できる

 © 2023, Dealing with Ambiguity