はじめに
cronの動作について、復習ために検証しました。
cronについては、以下を参考にしました。
infracollege
https://infracollege.vamdemicsystem.black/linux/
cronは、定期的にジョブを実行します。
crondというデーモンは1分ごとにcrontabファイルを調べて実行しています。
cronは、crontabコマンドと/etc/crontabのファイルとで、2つの方法で設定出来ますが、
どちらかを使用することをおすすめします。
動作環境
VirtualBox
Windows端末
CentOS7使用
事前確認 & 作業
TeraTermでrootユーザーでssh接続する。
一般ユーザーとして、testユーザーを作成する。
crondというデーモンが実行中であることを確認する。active (running)のため、現在実行中です。
[root@localhost ~]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since 火 2022-04-26 07:49:13 JST; 22min ago
Main PID: 657 (crond)
CGroup: /system.slice/crond.service
mq657 /usr/sbin/crond -n
4月 26 07:49:13 localhost.localdomain systemd[1]: Started Command Scheduler.
4月 26 07:49:13 localhost.localdomain crond[657]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 39% if used.)
4月 26 07:49:14 localhost.localdomain crond[657]: (CRON) INFO (running with inotify support)
4月 26 07:50:01 localhost.localdomain crond[657]: (root) RELOAD (/var/spool/cron/root)
4月 26 07:56:01 localhost.localdomain crond[657]: (*system*) RELOAD (/etc/crontab)
/var/spool/cron配下はtestユーザーでは、読み取り権限がなくアクセス出来ないため、rootへ昇格出来る様に設定をする。
#/etc/sudoersファイルを編集し、testユーザーにすべてのroot権限が必要なコマンドを実行する権限を追加
以下の行を追加
[root@localhost tmp]#vi /etc/sudoers
test ALL=(ALL) ALL
#設定が追加されたことを確認
[root@localhost tmp]# cat /etc/sudoers | grep test
test ALL=(ALL) ALL
検証 crontabコマンドで設定し、rootユーザーとtestユーザーの動作確認
crontab -eコマンドで、エディタを使用して以下の設定をcrontabに入れる。
1分ごとにdateコマンドの結果を出力する。
分( */1 )、毎時( * ) 毎日( * ) 毎月( * ) 毎曜日( * ) 日付コマンド(date)
crontab -lコマンド(設定内容の表示)は、crontab -r(設定内容の削除)と間違いやすいため、
crontabの設定内容の表示は、実際のログファイル「/var/spool/cron/配下」から直接確認したほうが安全です。
rootユーザーの場合
TeraTermを使用して、rootユーザーでSSH接続し、以下のコマンドを実行した。
#crontabを編集する。
[root@localhost ~]# crontab -e
#以下を設定する。
*/1 * * * * echo `date` >> /tmp/date_root.log
#crontabの中身を確認する。
[root@localhost ~]# crontab -l
*/1 * * * * echo `date` >> /tmp/date_root.log
#実際のログは以下に格納されている。
[root@localhost cron]# cat /var/spool/cron/root
*/1 * * * * echo `date` >> /tmp/date_root.log
[root@localhost cron]#
testユーザーの場合
TeraTermを使用し、testユーザーでSSH接続し、以下のコマンドを実行した。
[test@localhost ~]$ crontab -e
#以下を設定する。
*/1 * * * * echo `date` >> /tmp/date_test.log
#crontabの中身を確認する。
[test@localhost ~]$ crontab -l
*/1 * * * * echo `date` >> /tmp/date_test.log
[test@localhost ~]$sudo su -
#実際のログは以下に格納されている。
[root@localhost cron]# cat /var/spool/cron/test
*/1 * * * * echo `date` >> /tmp/date_test.log
[root@localhost cron]#
ログを確認
一分ごとにrootユーザーとtestユーザーのcronが動作していることをログから確認。
# /tmp/date_root.log cronから出力されたrootユーザーのファイル
# /tmp/date_test.log cronから出力されたtestユーザーのファイル
# ログの末尾から6行目までを表示
[root@localhost ~]# tail -n 6 /var/log/cron
Apr 26 08:18:01 localhost CROND[1782]: (root) CMD (echo `date` >> /tmp/date_root.log)
Apr 26 08:19:01 localhost CROND[1793]: (test) CMD (echo `date` >> /tmp/date_test.log)
Apr 26 08:19:01 localhost CROND[1794]: (root) CMD (echo `date` >> /tmp/date_root.log)
Apr 26 08:20:01 localhost CROND[1804]: (root) CMD (echo `date` >> /tmp/date_root.log)
Apr 26 08:20:01 localhost CROND[1805]: (test) CMD (echo `date` >> /tmp/date_test.log)
cronのファイルにdateコマンドの結果が出力されていることを確認
[root@localhost tmp]# tail -n 4 date_test.log
2022年 4月 26日 火曜日 08:18:01 JST
2022年 4月 26日 火曜日 08:19:01 JST
2022年 4月 26日 火曜日 08:20:01 JST
[root@localhost tmp]#
[root@localhost tmp]#
[root@localhost tmp]# tail -n 4 date_root.log
2022年 4月 26日 火曜日 08:18:01 JST
2022年 4月 26日 火曜日 08:19:01 JST
2022年 4月 26日 火曜日 08:20:01 JST
検証 /etc/crontabファイルを設定し、rootユーザーとtestユーザーで動作確認
/etc/crontabファイルにrootユーザーとtestユーザーの設定を追加する。
1分ごとにdateコマンドの結果を出力する。
vi /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
*/1 * * * * root echo `date` >> /tmp/date_root_etc_crontab.log ※rootユーザーのcronを追加
*/1 * * * * test echo `date` >> /tmp/date_test_etc_crontab.log ※testユーザーのcronを追加
上記のファイルの設定に、*(アスタリスク)の数が一つ多かったりしたら、ログにBadコマンドと出力れます。
[root@localhost ~]# less /var/log/cron
Apr 25 08:56:02 localhost crond[665]: (CRON) bad command (/etc/crontab)
dateコマンドの結果は一分ごとに出力を確認
# date_test_etc_crontab.log cronから出力されたrootユーザーのファイル
# date_root_etc_crontab.log cronから出力されたtestユーザーのファイル
[root@localhost tmp]# tail -n 6 /tmp/date_test_etc_crontab.log
2022年 4月 26日 火曜日 08:39:01 JST
2022年 4月 26日 火曜日 08:40:01 JST
2022年 4月 26日 火曜日 08:41:01 JST
2022年 4月 26日 火曜日 08:42:01 JST
[root@localhost tmp]#
[root@localhost tmp]# tail -n 6 /tmp/date_root_etc_crontab.log
2022年 4月 26日 火曜日 08:39:01 JST
2022年 4月 26日 火曜日 08:40:01 JST
2022年 4月 26日 火曜日 08:41:01 JST
2022年 4月 26日 火曜日 08:42:01 JST
[root@localhost tmp]#
ログが出力されているため、動作していることを確認
[root@localhost tmp]# cat /var/log/cron | grep "date_test_etc_crontab.log"
Apr 26 08:39:01 localhost CROND[2201]: (test) CMD (echo `date` >> /tmp/date_test_etc_crontab.log)
Apr 26 08:40:01 localhost CROND[2221]: (test) CMD (echo `date` >> /tmp/date_test_etc_crontab.log)
Apr 26 08:41:01 localhost CROND[2243]: (test) CMD (echo `date` >> /tmp/date_test_etc_crontab.log)
Apr 26 08:42:01 localhost CROND[2270]: (test) CMD (echo `date` >> /tmp/date_test_etc_crontab.log)
[root@localhost tmp]# cat /var/log/cron | grep "date_root_etc_crontab.log"
Apr 26 08:40:01 localhost CROND[2222]: (root) CMD (echo `date` >> /tmp/date_root_etc_crontab.log)
Apr 26 08:41:01 localhost CROND[2246]: (root) CMD (echo `date` >> /tmp/date_root_etc_crontab.log)
Apr 26 08:42:01 localhost CROND[2271]: (root) CMD (echo `date` >> /tmp/date_root_etc_crontab.log)
Apr 26 08:43:01 localhost CROND[2295]: (root) CMD (echo `date` >> /tmp/date_root_etc_crontab.log)