今回は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」でのスケジュールリング(フィールド)には独自の書式があります。実践的にも試験的にもしっかりと覚えておく必要があるでしょう。
フィールドは「分、時間、日、月、曜日、コマンド」の順に並んでいます。
「時間ごと」、「分ごと」は「/(スラッシュ)」を用いて表現します。
複数指定したい場合には「,」、範囲で指定したい場合には「-」を用います。
フィールドが何を指しているか理解しておけば、後はそのときに冷静対応すれば試験問題にも対応できそうですが、基本パターンは確認しておいた方がよいでしょう。
・毎時指定の分に実行する
#毎時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のディレクトリ
ディレクトリ | 内容 |
---|---|
|
サービス個別の設定ファイルを配置 |
|
毎時実行するスクリプトを配置 |
|
毎日実行するスクリプトを配置 |
|
毎週実行するスクリプトを配置 |
|
毎月実行するスクリプトを配置 |
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