SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【LPIC102】cronとジョブスケジューリング LPICで学ぶLinux6


今回はLinuxでシステム管理などを行う場合には実践度が高いcronとジョブスケジュールについて。

cron

Linuxシステム上で定期的な処理(ジョブ)などを実行するにはcronという仕組みを使用します。
ジョブを実行するのはcrondデーモンでスケジュールを編集するにはcrontabコマンドを使います。

crontab

crontabコマンドはスケジュール実行を行うcronの編集を行うコマンドになります。
各ユーザのcrontabコマンドにより編集されるファイルは「/var/spool/cron/」に格納されます。
ディストリビューションによりけりかもしれませんが、cron配下はスーパーユーザでないと参照できず、自身のファイルでも参照できないようです。

実践的に次に確認するcrontabコマンドにより確認、編集を行うためあまり使う機会がないかもしれません。

・cronファイルの例

/var/spool/cron/wantan

■crontabコマンド

cronの確認、設定はcrontabコマンドにオプションを付与して行うことが一般的です。

・オプション

オプション 内容
-e crontabファイルの編集を行う
-l crontabファイルの内容表示
-r crontabファイルの内容削除
-e crontabファイルの編集を行う
-i 削除時に確認する
-u ユーザを指定して編集する

まず前提としてcronはユーザごとに設定を行います。
なのでcrontabコマンドを実行すると自身が所有するcrontabファイルを対象に実行することになります。

・cronを参照する

[wantan@localhost log]$ crontab -l
*/10 * * * * source /usr/local/bin/vmstat.sh

・cronを編集する
編集はデフォルトで設定しているエディタが使用されます。

[wantan@localhost log]$ crontab -e
crontab: no changes made to crontab

実行結果

*/10 * * * * source /usr/local/bin/vmstat.sh

「-r」オプションは一発で全てクリアされるようなので、操作には注意が必要そうですね。

crontab」でのスケジュールリング(フィールド)には独自の書式があります。実践的にも試験的にもしっかりと覚えておく必要があるでしょう。

フィールドは「分、時間、日、月、曜日、コマンド」の順に並んでいます。

f:id:wantanBlog:20201129015047p:plain

「時間ごと」、「分ごと」は「/(スラッシュ)」を用いて表現します。
複数指定したい場合には「,」、範囲で指定したい場合には「-」を用います。

フィールドが何を指しているか理解しておけば、後はそのときに冷静対応すれば試験問題にも対応できそうですが、基本パターンは確認しておいた方がよいでしょう。

・毎時指定の分に実行する

#毎時10分に実行
10 * * * * source /usr/local/bin/vmstat.sh

・毎日指定の時刻に実行する

#毎日10時30分に実行
30 10 * * * source /usr/local/bin/vmstat.sh

・分ごとに実行

#10分ごとに実行
*/10 * * * * source /usr/local/bin/vmstat.sh

・毎月指定日に実行

# 毎月20日と25日に実行
30 10 20,25 * * source /usr/local/bin/vmstat.sh

・指定の曜日に実行

# 月曜日から金曜日まで実行
30 10 * * 1-5 source /usr/local/bin/vmstat.sh
システムのcrontab

通常のcrontabはユーザごとに所有しているものですが、それとは別にシステム全体で管理しているcronも存在します。
システムのcrontabは以下のファイルに設定されており、そこから実行タイミングごとのディレクトリに存在するファイルを読み込む形で実行されます。

/etc/crontab

・システムcrontabのディレクトリ

ディレクトリ 内容
/etc/cron.d サービス個別の設定ファイルを配置
/etc/cron.hourly 毎時実行するスクリプトを配置
/etc/cron.daily 毎日実行するスクリプトを配置
/etc/cron.weekly 毎週実行するスクリプトを配置
/etc/cron.monthly 毎月実行するスクリプトを配置

crontabファイルへの記述はユーザ名を追記する必要があります。

*  *  *  *  * user-name  command to be executed
アクセス制御

cronのアクセスは個別な設定によりアクセス制御を行います。

ファイル 内容
/etc/cron.allow 利用を許可する
/etc/cron.deny 利用を拒否する

記述内容によって以下のルールに従ってアクセスの制御を行います。

1)cron.allowがあれば、そこに記述されたユーザがcronを使用できる。
2)cron.allowがなければ、cron.denyに記述されていないユーザが使用できる。
3)どちらのファイルも存在しない場合、rootユーザのみが使用できる。

・記述方法
記述方法はファイルに一行に1ユーザのユーザ名を記述していくことになります。

[root@localhost wantan]# cat /etc/cron.deny
wantan

atコマンド

cronは定期的なスケジューリングを行う仕組みですが、一回限りのジョブを実行する場合にはatコマンドを使用します。

実際の実行はatコマンドのデーモンであるatdにより実行します。

なお、私の環境にはデフォルトでは「at」コマンドはインストールされていなかったため、存在しない場合にはインストールを行う必要があります。
また、デーモンを起動させないとスケジュールによる実行は行われません。
・インストール

yum install at

・デーモン起動

systemctl start atd

・ステータス確認

systemctl status atd

・オプション

オプション 内容
-d 予約中のジョブを削除する
-r 予約中のジョブを削除する
-l 予約中のジョブを表示する
-f コマンドを記述したファイルを指定する

入力は時刻を指定して対話形式で入力していきます。

・18時15分にコマンドをスケジュールする
入力が完了したら「Ctrl+D」(EOT)により確定させることができます。

[root@localhost wantan]# at 18:15
at> ls -l
at> <EOT>

・atコマンドの予約ジョブを確認する

[root@localhost wantan]# at -l
2       Sun Nov 29 18:15:00 2020 a root

・コマンドの実行をファイルで指定する

[wantan@localhost ~]$ at -f /usr/local/bin/vmstat.sh 18:35
job 4 at Sun Nov 29 18:35:00 2020

また、atからコマンド候補を表示してみると分かりますが、atコマンドにオプションを付与するのと同等のコマンドが個別に用意されています。

[wantan@localhost ~]$ at
at     atd    atq    atrm   atrun

「atq=at -l」、「atrm=at -r」など。

・指定日時表現
atコマンドの日時指定は直感的に分かりやすいものにはなっていますが、cronコマンドとは異なっているため別途確認しておく必要があります。

日時 書式
時刻 10:00
正午 noon
今日 today
明日 tomorrow
n日後 + n days
アクセス制御

atコマンドもcronコマンドとほぼ同様のアクセス制御を行うことができます。

ファイル 内容
/etc/at.allow 利用を許可する
/etc/at.deny 利用を拒否する

ルールについてもcronコマンドと似ていますが、両ファイルが存在しない場合の動作が異なります。

1)at.allowがあれば、そこに記述されたユーザがatを使用できる。
2)at.allowがなければ、at.denyに記述されていないユーザが使用できる。
3)どちらのファイルも存在しない場合、rootユーザのみが使用できる。


どちらのファイルも存在しない場合は、cronは全ユーザが利用できることになりますが、atはrootのみが使用できることになります。
※追記:上記認識は誤りです。制御の方法はどちらも同じです。
denyファイルが存在しているが記述がないときの勘違いをしていました。
at、crontabの両コマンドにおいて、どちらのファイルも存在しない場合にはrootユーザのみが使用でき、全ユーザが使用できる条件はdenyファイルのみ存在するが一切の記述がない場合、になります。


またatコマンドのアクセス制御はbatchコマンドにも反映されるようです。
batchコマンドはシステム負荷に応じて一回限りの処理を実行させるコマンドのようですが、LPIC102では範囲外になるようです。

systemdのtimerUnit

systemdを使用したシステムでは、timerUnitによりcronコマンドと同様のことを実現できます。
timerUnitは以下のディレクトリに「.timer」拡張子のファイルにより実行することができます。

・ファイルの例

# TimerUnitの説明
[Unit]
Description=test

# 実行タイミングの指定
[Timer]
OnBootSec=5min
Unit=test.service

# 自動起動で関連付けられるターゲット
[Install]
WantedBy=timers.target

・有効なTimerUnitを表示する
有効なTimerUnitを確認するためには、systemctl list-timersコマンドを使用します。

[root@localhost system]# systemctl list-timers
NEXT                         LEFT     LAST                         PASSED
日 2020-11-29 21:49:45 JST  5s ago   日 2020-11-29 21:49:50 JST  3ms ago      te
月 2020-11-30 16:51:35 JST  19h left 日 2020-11-29 16:51:35 JST  4h 58min ago sy

2 timers listed.
Pass --all to see loaded but inactive timers, too.

・Timerをセットする
ファイルの記述の他にsystemd-runコマンドによってもTimerをセットすることができます。

[root@localhost system]# systemd-run --unit=test2 --on-active=1s --on-unit-activ
e=60s uptime
Running timer as unit test2.timer.
Will run service as unit test2.service.

on-activeで最初の起動時間を設定し、on-unit-activeでその後の実行間隔を設定します。

ーーーーーーーーーーーーーーーーー

・前回(第五回)

www.wantanblog.com

・次回(第七回)
www.wantanblog.com