UbuntuでCronを設定する

定期的にサービスを再起動したい、バックアップを取得したい、そんな時役に立つのが`Cron`です。
Cronは定期的にコマンドなどを実行してくれるサービスです。

今回は、EC2のUbutuインスタンスに設定してみました。

いろんな設定方法があるかと思いますが、今回は<b>5ステップ</b>で設定できる方法です
（たぶん、最小ステップ、、、なはず、、、）

# 1. Cronが動いているかを確認する
まずは、稼働中のインスタンス上で`Cron`が動いているか確認してみます。
以下のように、"active(running)"になっていれば、サービスは動いています。

```Bash:
> sudo systemctl status cron
```

```Bash:
● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; enabled)
   Active: active (running) since Mon 2023-07-03 19:43:53 UTC; 2s ago
     Docs: man:cron(8)
     Main PID: 18708 (cron)
   CGroup: /system.slice/cron.service
       ├─11338 /usr/bin/atop -a -w /var/log/atop/atop_20230703 600
       └─18708 /usr/sbin/cron -f

Jul 03 19:43:53 ip-10-30-0-14 systemd[1]: Started Regular background program processing daemon.
Jul 03 19:43:53 ip-10-30-0-14 cron[18708]: (CRON) INFO (pidfile fd = 3)
Jul 03 19:43:53 ip-10-30-0-14 cron[18708]: (CRON) INFO (Skipping @reboot jobs -- not system startup)

```

# 2. Cronで動かすプログラムを作成する
Cronで定期的に実行するプログラムを作成します。
私は、`/usr/local/`にフォルダを作って、そこにプログラムを配置しました。

:::note warn
プログラムの実行権限は、chmodを使用し適切な権限を付与してください。
:::


実行するプログラムはこんな感じです。（nginxの再起動を実行します）

```Bash:nginx-restart.sh
  #!/bin/bash
  sudo systemctl restart nginx.service
  
```

# 3. Cronの設定をする
Cronは、`/etc/cron.d`に設定ファイルを作成します。
`/etc`の下には、`cron.daily`、 `cron.hourly`、`cron.monthly`、`cron.weekly`など、Cronに関連したフォルダがいくつかありますが、実行タイミングは自分で設定するので、`cron.d`の下に配置する形で設定します。

```Bash:
> sudo vi nginx-restart
```

```Bash:nginx-restart 
   # Restart nginx service
    SHELL=/bin/bash
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

    # 毎週日曜日、5:30amに実行するように設定
    30 5 * * 0 root /usr/local/job/nginx-restart.sh > /var/log/cron-test.log 2>&1
```

動作の確認用に、`> /var/log/cron-test.log`にログを出力しています。


# 4. Cron再起動
設定が終わったら、`Cron`を再起動します。

```Bash:
> sudo systemctl restart cron
```

:::note warn
とりあえず実行できるかどうかを確認する場合には、Cronの設定を5分ごとに実行など、動作の確認ができます。

その場合の設定は、以下のとおりです。

```Bash:Run every 5minutes
*/5 * * * * root /usr/local/job/nginx-restart.sh > /var/log/cron-test.log 2>&1
:::


# 5. Cronが無事に再起動できたかを確認する
Restartが正常に完了したかどうかを、`Status`コマンドで確認します。

```Bash:
> sudo systemctl status cron
```

```Bash:
● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; enabled)
   Active: active (running) since Mon 2023-07-03 19:43:53 UTC; 42min ago
     Docs: man:cron(8)
     Main PID: 18708 (cron)
   CGroup: /system.slice/cron.service
           ├─11338 /usr/bin/atop -a -w /var/log/atop/atop_20230703 600
           └─18708 /usr/sbin/cron -f

Jul 03 19:43:53 ip-10-30-0-14 systemd[1]: Started Regular background program processing daemon.
Jul 03 19:43:53 ip-10-30-0-14 cron[18708]: (CRON) INFO (pidfile fd = 3)
Jul 03 19:43:53 ip-10-30-0-14 cron[18708]: (CRON) INFO (Skipping @reboot jobs -- not system startup)
```


# [Tips] Cronの設定パターン
Cronは、5分おきに実行、1日1回実行など、実行タイミングを柔軟に設定することができます。
よくあるパターンをTipsとしてのせておきます！

```Bash
# 1分ごと
* * * * * root /usr/local/job/nginx-restart.sh > /var/log/cron-test.log 2>&1

# 5:00-5:59まで1分ずつ実行
* 5 * * * root /usr/local/job/nginx-restart.sh > /var/log/cron-test.log 2>&1

# 毎日5:00に実行
0 5 * * * root /usr/local/job/nginx-restart.sh > /var/log/cron-test.log 2>&1

# 毎月12日-20日5:00に実行
0 5 12-20 * * root /usr/local/job/nginx-restart.sh > /var/log/cron-test.log 2>&1

# 毎週月曜日-金曜日5:30に実行
30 5 * * 1-5 root /usr/local/job/nginx-restart.sh > /var/log/cron-test.log 2>&1

```

Cronの設定は、以上です。