Ubuntuでcronを使う（Linuxで定期的にプログラムを実行する方法）

:::note warn
当記事を理解するためにはLinuxのコマンド、ファイルの操作権限についての前提知識が必要です。
知識不足と感じられる方は、[Linuxの基礎](https://qiita.com/satohiro/items/e1194214306bce7bcf20)から始めることをオススメいたします。
:::
## はじめに
[Progaku Advent Calendar 2024](https://qiita.com/advent-calendar/2024/progaku) 3日目担当のリプトンと申します。よろしくお願いいたします。
今回はLinux環境でプログラムの定期実行する方法についてまとめてみました。
## 実行環境
Ubuntu22.04
~~~shell:shell
root@xxx-xxx-xxx-xxx:~# cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
~~~
## Linuxの定期実行の実装検討
cronを使用することにしました。メジャーな方法かと思います。

## cronの実装


### ①cronサービスが動いているか確認
~~~shell:shell
root@xxx-xxx-xxx-xxx:~# systemctl status cron
● cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon xxxx-xx-xx xx:xx:xx JST; xx days ago
       Docs: man:cron(8)
   Main PID: 901 (cron)
      Tasks: 1 (limit: 2220)
     Memory: 49.1M
        CPU: 15h 51min 44.785s
     CGroup: /system.slice/cron.service
             └─901 /usr/sbin/cron -f -P
~~~
Active: active (running)なので大丈夫ですね。

### ②cronで動かすプログラムを作成
/etc/selenium/cron.pyを作成。pythonファイルの中身は今回は関係ないので割愛。
### ③cronを設定する際のファイルを配置するディレクトリの確認
>/etc/cron.hourly/: 毎時実行するファイルを置くディレクトリ
/etc/cron.daily/: 毎日実行するファイルを置くディレクトリ (logrotateなど)
/etc/cron.monthly/: 毎月実行するファイルを置くディレクトリ
/etc/cron.weekly/: 毎週実行するファイルを置くディレクトリ
/etc/cron.d/: 上記以外の自動実行に関する設定ファイル
/var/spool/anacron/: anacron関連のファイル
/var/spool/cron/crontabs/: anacron関連のファイル
>
→毎時0分、20分、40分に実行してほしかったので/etc/cron.d/に作成することに。

### ④cron設定の書き方
20分に1回シェル実行をしてほしかったので下記のように記載。
~~~shell:/etc/cron.d/selenium_cron
*/20 * * * * root /bin/bash /etc/selenium/cron.sh
~~~
~~~shell:/etc/selenium/cron.sh
#!/bin/bash
cd /etc/selenium
/usr/bin/python3 cron.py
~~~
以上で必要なファイルを用意できました。
### ⑤cron.shの実行権限付与
完成したと思ったそこの<strong>あなた！</strong>（はい、私です🫡）
<strong>cron.shの実行権限がないとこけます。</strong>つけましょう。
（ファイル所有者のみ権限与えてもよかったかもですが、致命的ではないのでここでは放置します。）
~~~shell:shell
root@xxx-xxx-xxx-xxx:/etc/selenium# ls -l
-rw-r--r-- cron.sh
root@xxx-xxx-xxx-xxx:/etc/selenium# chmod a+x cron.sh
root@xxx-xxx-xxx-xxx:/etc/selenium# ls -l
-rwxr-xr-x cron.sh
~~~
### ⑥念のため、cronサービスの再起動
~~~shell:shell
root@xxx-xxx-xxx-xxx:~# systemctl restart cron
~~~

### ⑦実行されるまで待つ
今回の場合、20分待てば実行されるのでそれまでティータイム🫖です。
### ⑧実行後ログを確認する
ログを確認すると計画通りに実行できていました。
~~~shell:shell
root@xxx-xxx-xxx-xxx:~# journalctl -r -u cron
Nov xx 13:20:01 xxx-xxx-xxx-xxx CRON[299458]: (root) CMD (/bin/bash /etc/selenium/cron.sh)
~~~
## あとがき
予算の都合からLinuxサーバーを使用することも多いと思います。
今回のような設定系は特に忘れてしまいがちです。記事兼忘備録として作成させていただきました。
もし内容に間違いなどありましたらお手数ですがコメントでお知らせください。
## ↓参考にした記事（ありがとう）

https://qiita.com/shuntaro_tamura/items/c759bc318859a1203211

https://qiita.com/Hide-Zaemon/items/d143f502a082a1772600

https://tex2e.github.io/blog/linux/scheduled-jobs

https://qiita.com/i13ame/items/bf4b6a0e3485ddc838ce

https://qiita.com/shisama/items/5f4c4fa768642aad9e06

:::note info
<strong>最後にちょっとだけProgakuの紹介</strong>
Progakuは完全無料のプログラミングの勉強を支援するオンラインコミュニティです。執筆時のメンバー数は215名です。
メンバーはエンジニアとエンジニアを目指す人で構成されています。質問がある方が自由に投稿し回答を募るスタイルです。
不定期にメンバー募集をしていますので、興味がある方は代表の[とくゆー](https://x.com/tokuyuuuuuu)までお問い合わせください。
ありがとうございました。
:::