ジョブスケジューリングとは
決められた時刻に、指定したコマンドを定期的に実行する機能で、cron(クーロン)と呼ばれている。
システムの保守では、locateコマンドのデータベース更新やログファイルの定期的なローテーションなどに用いられる。
インストール
Amazon Linux2023でデフォルトで、未インストールのため下記の対応をしていきます。
# インストール有無の確認
[ec2-user@ip-172-31-45-214 ~]$ rpm -q cronie
package cronie is not installed
# インストールする
[ec2-user@ip-172-31-45-214 ~]$ sudo yum install -y cronie
Last metadata expiration check: 12:23:41 ago on Tue Jan 30 13:49:27 2024.
Dependencies resolved.
===================================================================================================================================================================================
Package Architecture Version Repository Size
===================================================================================================================================================================================
Installing:
cronie x86_64 1.5.7-1.amzn2023.0.2 amazonlinux 115 k
Installing dependencies:
cronie-anacron x86_64 1.5.7-1.amzn2023.0.2 amazonlinux 32 k
Transaction Summary
===================================================================================================================================================================================
Install 2 Packages
Total download size: 147 k
Installed size: 341 k
Downloading Packages:
(1/2): cronie-anacron-1.5.7-1.amzn2023.0.2.x86_64.rpm 516 kB/s | 32 kB 00:00
(2/2): cronie-1.5.7-1.amzn2023.0.2.x86_64.rpm 1.3 MB/s | 115 kB 00:00
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 965 kB/s | 147 kB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : cronie-1.5.7-1.amzn2023.0.2.x86_64 1/2
Running scriptlet: cronie-1.5.7-1.amzn2023.0.2.x86_64 1/2
Created symlink /etc/systemd/system/multi-user.target.wants/crond.service → /usr/lib/systemd/system/crond.service.
Installing : cronie-anacron-1.5.7-1.amzn2023.0.2.x86_64 2/2
Running scriptlet: cronie-anacron-1.5.7-1.amzn2023.0.2.x86_64 2/2
Verifying : cronie-anacron-1.5.7-1.amzn2023.0.2.x86_64 1/2
Verifying : cronie-1.5.7-1.amzn2023.0.2.x86_64 2/2
Installed:
cronie-1.5.7-1.amzn2023.0.2.x86_64 cronie-anacron-1.5.7-1.amzn2023.0.2.x86_64
Complete!
サービスの起動
# 事前確認
[ec2-user@ip-172-31-45-214 ~]$ systemctl status crond
○ crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; preset: enabled)
Active: inactive (dead)
# cronデーモンの起動設定
[ec2-user@ip-172-31-45-214 ~]$ sudo systemctl start crond
[ec2-user@ip-172-31-45-214 ~]$ sudo systemctl enable crond
# 起動設定後の確認
[ec2-user@ip-172-31-45-214 ~]$ systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; preset: enabled)
Active: active (running) since Wed 2024-01-31 02:15:42 UTC; 31s ago
Main PID: 137251 (crond)
Tasks: 1 (limit: 1114)
Memory: 996.0K
CPU: 6ms
CGroup: /system.slice/crond.service
└─137251 /usr/sbin/crond -n
Jan 31 02:15:42 ip-172-31-45-214.ec2.internal crond[137251]: (CRON) STARTUP (1.5.7)
Jan 31 02:15:42 ip-172-31-45-214.ec2.internal systemd[1]: Started crond.service - Command Scheduler.
Jan 31 02:15:42 ip-172-31-45-214.ec2.internal crond[137251]: (CRON) INFO (Syslog will be used instead of sendmail.)
Jan 31 02:15:42 ip-172-31-45-214.ec2.internal crond[137251]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 81% if used.)
Jan 31 02:15:42 ip-172-31-45-214.ec2.internal crond[137251]: (CRON) INFO (running with inotify support)
設定ファイル
システムの設定ファイルは、/etc/crontabです。
分 | 時 | 日 | 月 | 曜日 | ユーザ | コマンド |
---|---|---|---|---|---|---|
0-59 | 0-23 | 1-31 | 1-12 | 0-7(0と7は日曜) | ユーザ名 | 実行コマンド |
フィールドの指定
フィールド表記 | 説明 |
---|---|
* | 全ての数字に一致 |
- | 「時」に15-17を指定すると、15時、16時、17時を表す。 「曜日」に1-4を指定すると、月曜、火曜、水曜、木曜を表す。 |
, | 「分」に0,15,30,45を指定すると、0分、15分、30分、45分を表す。 |
/ | 「分」に10-20/2を指定すると、10分から20分の間で2分間隔を表す。 「分」に:/2を指定するとその時間内で2分間隔を表す。 |
[ec2-user@ip-172-31-45-214 ~]$ cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 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
crontab オプション
が記載方法になる。
オプション | 説明 |
---|---|
-e | 編集 |
-l | 表示 |
-r | 削除 |
簡単なcrontabファイルの作成
# dateコマンドが2分おきに実行して、/tmp/datefileに出力するコマンド
[ec2-user@ip-172-31-45-214 ~]$ crontab -e
[ec2-user@ip-172-31-45-214 ~]$ crontab -l
*/2 * * * * /bin/date >> /tmp/datefile
[ec2-user@ip-172-31-45-214 ~]$ tail -f /tmp/datefile
Wed Jan 31 04:10:02 UTC 2024
Wed Jan 31 04:12:01 UTC 2024
Wed Jan 31 04:14:01 UTC 2024
Wed Jan 31 04:16:01 UTC 2024
Wed Jan 31 04:18:01 UTC 2024
cronユーザの制限
crontabコマンドに対して、一般ユーザの実行制限を設定するには/etc/cron.allow
と/etc/cron.deny
ファイルを使用します。
ルール
- 「cron.allow」がある場合、ファイルに記述されているユーザがcronを利用できる。
- 「cron.allow」がなく「cron.deny」がある場合、「cron.deny」に記載がないユーザが利用できる。
- 「cron.allow」と「cron.deny」の両方がない場合、すべてのユーザが利用できる。
# root権限で、cron.denyファイルを編集
[ec2-user@ip-172-31-45-214 ~]$ sudo vi /etc/cron.deny
[ec2-user@ip-172-31-45-214 ~]$ cat /etc/cron.deny
ec2-user
# 実行ができないようになっている。
[ec2-user@ip-172-31-45-214 ~]$ crontab -l
You (ec2-user) are not allowed to use this program (crontab)
See crontab(1) for more information
anacron
anacronは、コマンドを日単位の感覚で定期的に実行する。
主に、管理者がシステム保守のために設定します。
[ec2-user@ip-172-31-45-214 ~]$ sudo cat /etc/cron
cron.d/ cron.daily/ cron.deny cron.hourly/ cron.monthly/ cron.weekly/ crontab
atサービス
指定した時刻に1回だけ実行するには、atコマンドを使用します。
at [オプション] 時間
が記載方法になる。
システムの負荷が低くなったときに指定したコマンドを実行するには、batchコマンドを使用します
batch [オプション]
が記載方法になる。
オプション | 説明 |
---|---|
-l | 実行ユーザのキューに入っているジョブを表示する。 |
-d | ジョブを削除する |
時間・日付の主な指定方法
時間指定 | 説明 |
---|---|
HH:MM | 10:15と指定すると、10時15分を表す |
midnight | 深夜0時を表す |
noon | 正午を表す |
now | 現在の時刻を表す |
teatime | 午後4時を表す |
am、pm | 10amと指定すると、午前10時 |
MMDDYY、MM/DD/YY、MM.DD.YY | 013124と指定すると、2024年1月31日を表す |
today | 今日を表す |
tomorrow | 明日を表す |
atコマンドでジョブ登録
# 今から1分後に、echoコマンドを実行する。
[ec2-user@ip-172-31-45-214 ~]$ at now +1 minutes
warning: commands will be executed using /bin/sh
at> echo atCommandTEST > /home/ec2-user/fileA
at> <EOT>
job 3 at Wed Jan 31 07:01:00 2024
# atキューを確認する。
[ec2-user@ip-172-31-45-214 ~]$ sudo atq
3 Wed Jan 31 07:01:00 2024 a ec2-user
# 実行結果の確認
[ec2-user@ip-172-31-45-214 ~]$ cat fileA
atCommandTEST
※ジョブの削除を行うときは、atrm
またはat -d
コマンドに引数として、ジョブ番号を指定する。
atコマンド利用ユーザの制限
root権限は、at
とbatch
コマンドの実行は許可されているが、一般ユーザはファイルによって利用制限がかかる。
/etc/at.allowと/etc/at.denyのそれぞれ許可拒否するユーザ名を記載する。
ユーザ制限早見表
at.deny | at.allow | 説明 |
---|---|---|
dog | なし | dog以外のユーザが実行可能 |
なし | dog | rootとdogのみが実行可能 |
dog | cat | rootとcatのみが実行可能 |
なし | なし | rootのみが実行可能 |