VirtualBox CentOS7 cronについて検証してみた

### はじめに
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)のため、現在実行中です。
```ゲストOS
[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へ昇格出来る様に設定をする。
```ゲストOS
#/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接続し、以下のコマンドを実行した。
```ゲストOS
#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接続し、以下のコマンドを実行した。

```ゲストOS
[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が動作していることをログから確認。
```ゲストOS
# /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コマンドの結果が出力されていることを確認
```ゲストOS
[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コマンドの結果を出力する。
```ゲストOS
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コマンドと出力れます。
```ゲストOS
[root@localhost ~]# less /var/log/cron
Apr 25 08:56:02 localhost crond[665]: (CRON) bad command (/etc/crontab)
```

dateコマンドの結果は一分ごとに出力を確認
```ゲストOS
# 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]#
```
ログが出力されているため、動作していることを確認
```ゲストOS
[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)
```