【Linux】cronの設定 (/var/spool/cron または /etc/cron.d で管理する。)

# cronについて
特定の時間にプログラムを実行したい場合、`cron`と呼ばれる機能を使用します。`crontab`コマンドを使用したり、`/etc/cron.d`配下に設定ファイルを配置する事で`cron`を利用出来ます。

`crontab`コマンドは入力ミスすると、設定ファイルが消えてしまう事があります。なので、個人的には`/etc/cron.d`配下に設定ファイルを配置した方が良いかなと考えております。

# crontabコマンドを使用する。(/var/spool/cron)
`crontab`コマンドでよく利用するオプション及び設定ファイルの書式を下記に記載しております。

| オプション | 説明 |
|---|---|
| -l | crontabの内容を表示 |
| -e | crontabの編集 |
| -r | crontabの削除 |
| -u | ユーザーを指定 |

```shell_session:設定ファイルの書式
# 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
# |  |  |  |  |
# *  *  *  *  *

# 5分毎に Check_Disksize.sh を動かす
*/5 * * * * ./Check_Disksize.sh

# 8時に Check_Disksize.sh を動かす
0 8 * * * ./Check_Disksize.sh

```

`crontab -e`コマンドで設定ファイルを編集して保存すると、`/var/spool/cron`配下に設定ファイルが生成されます。
現在は設定ファイルを生成しておりませんので、`/var/spool/cron`配下には何もありません。
`crontab -l`コマンドで設定ファイルの内容を確認しようとしても、設定ファイルがないと出力されます。

```shell_session:/var/spool/cron
[root@localhost /]# ll /var/spool/cron
合計 0
[root@localhost /]# crontab -l
no crontab for root
```

`cron`のテスト用に、`Check_Disksize.sh`を作成します。
そして、1分毎に `Check_Disksize.sh`を動くように設定してみます。
`/var/spool/cron`配下に設定ファイルが生成されている事も確認します。

```shell_session:設定
[root@localhost ~]# vim Check_Disksize.sh
[root@localhost ~]# chmod 755 Check_Disksize.sh
[root@localhost ~]# cat Check_Disksize.sh
#!/bin/bash

date >> Check_Disksize
df -h >> Check_Disksize

root@localhost ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@localhost ~]# crontab -l
*/1 * * * * ./Check_Disksize.sh
[root@localhost ~]# ll /var/spool/cron
合計 4
-rw------- 1 root root 30  4月 12 21:12 root
```

設定出来ました。
では、動いている事を確認します。

```shell_session:動作確認
[root@localhost ~]# cat Check_Disksize
2023年  4月 12日 水曜日 21:19:01 JST
ファイルシス            サイズ  使用  残り 使用% マウント位置
devtmpfs                  1.9G     0  1.9G    0% /dev
tmpfs                     1.9G     0  1.9G    0% /dev/shm
tmpfs                     1.9G  8.6M  1.9G    1% /run
tmpfs                     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   6.2G  1.7G  4.6G   26% /
/dev/sda1                1014M  194M  821M   20% /boot
tmpfs                     379M     0  379M    0% /run/user/1000
tmpfs                     379M     0  379M    0% /run/user/0
```

お次は、別ユーザーで7時15分に`Check_Disksize.sh`を動かします。
`crontab -u`でユーザーを指定できます。

```shell_session:設定
[root@localhost ~]# crontab -u test_01 -e
crontab: installing new crontab
[root@localhost ~]# crontab -u test_01 -l
15 7 * * * ./Check_Disksize.sh
[root@localhost ~]# ll /var/spool/cron
合計 8
-rw------- 1 root root 30  4月 12 21:12 root
-rw------- 1 root root 31  4月 13 07:09 test_01
[root@localhost ~]# cp -p Check_Disksize.sh /home/test_01
[root@localhost ~]# chown test_01:test_01 /home/test_01/Check_Disksize.sh
[root@localhost ~]# cd /home/test_01
[root@localhost test_01]# ll
合計 4
-rwxr-xr-x 1 test_01 test_01 60  4月 12 21:11 Check_Disksize.sh
[root@localhost test_01]# cat Check_Disksize
2023年  4月 13日 木曜日 07:15:01 JST
ファイルシス            サイズ  使用  残り 使用% マウント位置
devtmpfs                  1.9G     0  1.9G    0% /dev
tmpfs                     1.9G     0  1.9G    0% /dev/shm
tmpfs                     1.9G  8.6M  1.9G    1% /run
tmpfs                     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   6.2G  1.7G  4.6G   26% /
/dev/sda1                1014M  194M  821M   20% /boot
tmpfs                     379M     0  379M    0% /run/user/1000
```

上記で動作検証は行えたので、設定ファイルを削除したいと思います。
`crontab -r`で削除出来ます。
この`-r`が少し曲者です。`-e`で編集を行えるのですが、入力ミスで`-r`で実行してしまう事がございます。
設定ファイルは編集する際などは、予期せぬ事を防ぐ為にバックアップを取得しておいた方が良いと思います。

```shell_session:設定ファイルの削除
[root@localhost ~]# ll /var/spool/cron
合計 8
-rw------- 1 root root 30  4月 12 21:12 root
-rw------- 1 root root 31  4月 13 07:09 test_01
[root@localhost ~]# cp -rp /var/spool/cron /tmp/cron.backup
[root@localhost ~]# crontab -r
[root@localhost ~]# ll /var/spool/cron
合計 4
-rw------- 1 root root 31  4月 13 07:09 test_01
[root@localhost ~]# crontab -u test_01 -r
[root@localhost ~]# ll /var/spool/cron
合計 0
```

# etc/cron.d 配下で設定ファイルを管理
`etc/cron.d`配下に設定ファイルを配置する事で、`cron`を利用する事が出来ます。設定ファイルの書式を下記に記載しております。

```shell_session:設定ファイルの書式
# 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

# test_01ユーザーで、1分毎に Check_Disksize.sh を動かす
*/1 * * * *  test_01 ./Check_Disksize.sh

# rootユーザーで、1日15時に Check_Disksize.sh を動かす
0 15 1 * *  root ./Check_Disksize.sh

```

設定ファイルを配置していきます。
8時13分に`Check_Disksize.sh`を動かすように設定しております。

```shell_session:設定ファイルの書式
[root@localhost cron.d]# cd /etc/cron.d
[root@localhost cron.d]# ll
合計 4
-rw-r--r--. 1 root root 128  1月 14  2022 0hourly
[root@localhost cron.d]# vim test_01
[root@localhost cron.d]# cat test_01
13 8 * * * test_01 ./Check_Disksize.sh
[root@localhost cron.d]# cat /home/test_01/Check_Disksize
2023年  4月 13日 木曜日 08:13:01 JST
ファイルシス            サイズ  使用  残り 使用% マウント位置
devtmpfs                  1.9G     0  1.9G    0% /dev
tmpfs                     1.9G     0  1.9G    0% /dev/shm
tmpfs                     1.9G  8.6M  1.9G    1% /run
tmpfs                     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   6.2G  1.7G  4.6G   26% /
/dev/sda1                1014M  194M  821M   20% /boot
tmpfs                     379M     0  379M    0% /run/user/1000
tmpfs                     379M     0  379M    0% /run/user/0
```

以上です。