LinuC Level1 v10.0 対策コース(パート2)15/29
定期実行について
ここでは、様々な定期実行とその設定ついて解説します。
cronとは
cronとは定期的にコマンドやスクリプトを自動で実行するツールです。一時間ごとや、特定の曜日の特定の時刻など、詳細に日時を指定することができ、定期的なログやバックアップの取得に使用されます。
cronの仕組み
まず、実行したいコマンド、スクリプトを/var/spool/cron/ユーザー名のファイルに登録します。crontab -eと入力すると/var/spool/cron/ユーザー名のファイルが自動で作成されます。このファイルに追加したコマンドやスクリプトは、crondデーモンがコマンドを実行します。
cronの記述の仕方
ここではcronを使って、特定の時刻になるとファイルを自動で作成する方法を解説します。
crontab -eでファイルを編集する 今回は毎時30分ごとに、ユーザーのホームディレクトリにtest.txtというファイルがなければ作成され、あれば修正時刻を更新するようにします。
crontab -e #設定を記述する"/var/spool/cron/ユーザー名"を開く
#/var/spool/cron/ユーザー名に以下のように記述する
30 * * * * /usr/bin/touch /home/ユーザー名/test.txt
/var/spool/cron/ユーザー名の記述内容
| 項目 | 説明 |
|---|---|
| 30 * * * * | 指定する日時の設定。5つに区切られており、左から順に分・時・日・月・曜日と記述する。今回は毎時30分ごとの設定のため、分の項目のみ記述しています。 |
| /usr/bin/touch /home/ユーザー名/test.txt | 実行するコマンドの記述。touch /home/ユーザー名/test.txtの意味。注意点としてコマンドは絶対パスで記述するためtouchコマンドの絶対パス/usr/bin/touchと記述している。 |
実行結果の確認
ls
test.txt # ホームディレクトリになければ新たにtest.txtファイルが作成されている
crontabコマンドについて
crontab コマンドはデフォルトでrootユーザーと一般ユーザーの両方が使用できる設定になっています。
ユーザーの crontab の使用を制限したい場合、ユーザー名を /etc/cron.allow または /etc/cron.deny ファイルに記述します。
/etc/cron.allowファイルは、crontabの使用を許可するユーザ名を記述し、/etc/cron.denyファイルには使用を制限するユーザー名を記述します。/etc/cron.allow、/etc/cron.denyファイルは必要に応じて作成してください。
/etc/cron.allow、/etc/cron.denyファイルの有無での挙動
| cron.allow | cron.deny | 使用可能なユーザー |
|---|---|---|
| なし | なし | 全ユーザー |
| あり | あり | cron.allowに登録されているユーザー。 共に存在する場合はcron.denyの内容は無視されます。 |
| なし | あり | cron.denyに登録されていないユーザー |
| あり(しかし内容は空) | あり | 使用できるユーザーはいません |
| なし | あり(空) | 全ユーザー |
/etc/cron.allow、/etc/cron.denyファイルの記述の仕方
/etc/cron.allow、/etc/cron.denyファイルに、それぞれ対象となるユーザー名を記述します。
/etc/cron.allow
envaderuser #ユーザー名(envaderuser)を許可する
/etc/cron.deny
envaderuser #ユーザー名(envaderuser)を拒否する
設定が反映されているか確認
[envaderuser]$ crontab -e
You (envaderuser) are not allowed to use this program (crontab)
See crontab(1) for more information #拒否されていることが確認できる
/etc/at.allow、/etc/at.deny
/etc/at.allow、/etc/at.denyファイルも同様にatコマンドの使用制限を行うファイルで、それぞれのファイルにユーザー名を記述すると反映されます。
/etc/at.deny
envaderuser #ユーザー名(envaderuser)を拒否する
設定が反映されているか確認
[envaderuser]$ at 10:00
You do not have permission to use at. # envaderuserによるatコマンドの使用が制限されていることが確認できます。
anacronについて
anacronは、日付、月、曜日、週を指定して定期的にジョブを実行するデーモンのことで、cronを実行するcrondをサポートする役割があります。
anacronの設定ファイルは /etc/anacrontab です。
anacronとcron
cronは指定した日時にジョブが指定された時刻に正確に実行されます。しかし、何かしらの原因でコンピュータの電源が落ちた場合は、復旧までの間に指定されているジョブは実行されません。
一方でanacronは指定した時刻に正確に処理を実行せず、指定した時刻の範囲内でジョブを実行します。ジョブが実行されないと影響が大きい場合はanacronに設定することで、コンピュータ復旧後にもジョブを実行することができます。なおcronでは1日に何回もジョブを実行できますが、anacronの場合は1日に1回しかジョブを実行することはできません。
anacronとcronの特徴
| anacronの特徴 | cronの特徴 |
|---|---|
ジョブの設定場所は/etc/anacrontabのみで、rootユーザーのみが設定可能 | /etc/crontab、/var/spool/cron/ユーザー名などジョブの設定場所が複数ある |
| 1日単位での指定かつ1日1回のみ実行可能。時間指定もできない | 秒、分、時、日、曜日の単位で日時の指定が可能 |
| コンピュータが停止していた場合、コンピュータ起動後に必要なジョブを実行する | 指定した日時に仮にコンピュータが停止していると、ジョブは実行されず再実行もしない |
anacrontabが実行される流れ
/etc/anacrontabは、/etc/cron.hourly配下の0anacronファイルにより実行されます。/etc/cron.hourly配下のファイルは/etc/cron.d配下の0hourlyファイルにより1分ごとに実行される仕組みです。
つまり、1分ごとに0hourlyファイルで0anacronを実行するため、anacrontabのジョブが実行される流れです。ただし、前述したようにanacronは1日1回しか実行することができません。
これは0anacronファイル内の処理で、anacronが最後に実行された日付と現在の日付を比較し、異なっている場合のみ実行するという処理を行なっているからです。
0hourlyファイルの中身
cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly #毎時1分毎に/etc/cron.hourlyが実行される
0anacronファイルの中身
sudo cat /etc/cron.hourly/0anacron
#!/bin/sh
# Check whether 0anacron was run today already
if test -r /var/spool/anacron/cron.daily; then #cron.dailyはanacronが最後に実行された日付が記録されたファイル
day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then #cron.dailyの日付と現在の日付の比較
exit 0;
fi
# Do not run jobs when on battery power
if test -x /usr/bin/on_ac_power; then
/usr/bin/on_ac_power >/dev/null 2>&1
if test $? -eq 1; then
exit 0
fi
fi
/usr/sbin/anacron -s #anacronの実行
/etc/anacrontabの中身
/etc/anacrontabの内容は環境変数と定期実行記述部分( #period in days 以下)に分かれています。定期実行処理部分の記述は、/etc/crontabの記述と異なるため注意が必要です。
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
/etc/anacrontabでの定期実行の記述の仕方
1 5 cron.daily nice run-parts /etc/cron.dailyを例に以下に解説します。
| 項目 | 説明 |
|---|---|
| 1(period in days) | ジョブの実行頻度。ここの数字は実行する日の間隔になります。今回は1と指定してあるので1日おきに実行されるという意味です。また、@monthlyや@weeklyなどの特殊文字を使うことも可能で、これらはそれぞれ1ヶ月おき、1週間おきを意味します。 |
| 5(delay in minutes) | ジョブの開始までの遅延時間を指定します。これはランダムで、指定した時間内でジョブが開始されます。 |
| cron.daily(job-identifier) | タイムスタンプを記録するファイルを表しています。 |
| nice run-parts /etc/cron.daily(command) | 実行するコマンドを指定します。 |
anacronでジョブが実行されるタイミング
anacronは処理が実行のタイミングをdelay in minute、RANDOM_DELAYの上下限値、START_HOURS_RANGEを組み合わせて指定します。
標準ではdelay in minuteが5分、RONDOM_DELEYが45分、最短の遅延時間は6分、START_HOURS_RANGEが3-22と設定されています。
この場合ジョブの実行時間はdeley in mimute(5分)+ 最短の遅延時間(6分)~dely in minute(5分) + RONDOM_DELY(45分)の範囲で実行されます。またSTART_HOURS_RANGEが3-22と設定されているので、3時11分〜3時50分の間でジョブが実行されます。
その他の定期実行コマンドについて
他にも定期実行をサポートするコマンドにはat、atq、atrmが存在します。
at
atは特定の日時を指定し、自動でコマンドやスクリプトを実行します。cronは設定を繰り返し実行するのに対し、atは一度きりの実行となります。例として特定の日時にホームディレクトリにtest2.textファイルを、自動で作成する設定を行います。
日時の指定
at 時間 年-月-日という形式で日時を指定します。
at 22:00 2022-11-11 #2022年11月11日に日時を指定
その他日時の指定の仕方
#10分後に処理を実行する
at now +10minute
#時間のみの指定(次にその時間になった時に実行する)
at 22:00
コマンドの設定
日時を入力するとat>と表示されるので実行したいコマンドを入力します。Ctrl + Dで終了できます。
at 23:30 2022-6-5
at> touch /home/username/test2.txt
at> <EOT>
job 10 at Sun Jun 5 23:30:00 2022
実行結果の確認
ls
test2.txt
実行予定のジョブの一覧
at -lで実行予定のジョブの一覧を表示します。
atqコマンドについて
atqは、atで予約している登録を表示します。at -lと同様の動きです。
ジョブ番号、ジョブを実行する日時、キュー、登録したユーザー名が出力されます。
一般ユーザーで atq を実行すると、そのユーザーが予約したジョブのみ表示されます。rootユーザーでatqコマンドを実行すると登録されている全ての処理が表示されます。
一般ユーザー
atq
1 Wed Jun 8 22:00:00 2022 a envaderuser #現在登録されているatコマンドの処理が表示された。
2 Wed Jun 8 22:22:00 2022 a envaderuser
rootユーザー
[ec2-user@ip-10-0-0-65 ~]$ sudo atq
1 Wed Jun 8 22:00:00 2022 a ec2-user
2 Wed Jun 8 22:22:00 2022 a ec2-user
3 Wed Jun 8 12:22:00 2022 a root
4 Wed Jun 8 12:23:00 2022 a root
atrmコマンドについて
atrmはatで登録された処理を削除します。削除にはatrm ジョブ番号と入力します。ジョブ番号は複数指定が可能です。
atrmコマンドを実行
sudo atrm 2 3 #ジョブ番号2、3を削除する
削除されたか確認
sudo atq
1 Wed Jun 8 22:00:00 2022 a envaderuser
4 Wed Jun 8 12:23:00 2022 a root #2、3が削除されている
まとめ
anacron は、指定した間隔(日単位)でジョブを定期的に実行するデーモンです。 cron と異なり、システムが24時間稼働していない場合でも、ジョブの実行が保証されます。例えば、ジョブの実行予定時にコンピュータの電源が落ちていた場合でも、電源が入った時点でそのジョブを実行できます。ただし、1日1回のみの実行となります。
記事の内容は理解できましたか?
