当記事を理解するためにはLinuxのコマンド、ファイルの操作権限についての前提知識が必要です。
知識不足と感じられる方は、Linuxの基礎から始めることをオススメいたします。
はじめに
Progaku Advent Calendar 2024 3日目担当のリプトンと申します。よろしくお願いいたします。
今回はLinux環境でプログラムの定期実行する方法についてまとめてみました。
実行環境
Ubuntu22.04
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サービスが動いているか確認
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回シェル実行をしてほしかったので下記のように記載。
*/20 * * * * root /bin/bash /etc/selenium/cron.sh
#!/bin/bash
cd /etc/selenium
/usr/bin/python3 cron.py
以上で必要なファイルを用意できました。
⑤cron.shの実行権限付与
完成したと思ったそこのあなた!(はい、私です🫡)
cron.shの実行権限がないとこけます。つけましょう。
(ファイル所有者のみ権限与えてもよかったかもですが、致命的ではないのでここでは放置します。)
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サービスの再起動
root@xxx-xxx-xxx-xxx:~# systemctl restart cron
⑦実行されるまで待つ
今回の場合、20分待てば実行されるのでそれまでティータイム🫖です。
⑧実行後ログを確認する
ログを確認すると計画通りに実行できていました。
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サーバーを使用することも多いと思います。
今回のような設定系は特に忘れてしまいがちです。記事兼忘備録として作成させていただきました。
もし内容に間違いなどありましたらお手数ですがコメントでお知らせください。
↓参考にした記事(ありがとう)
最後にちょっとだけProgakuの紹介
Progakuは完全無料のプログラミングの勉強を支援するオンラインコミュニティです。執筆時のメンバー数は215名です。
メンバーはエンジニアとエンジニアを目指す人で構成されています。質問がある方が自由に投稿し回答を募るスタイルです。
不定期にメンバー募集をしていますので、興味がある方は代表のとくゆーまでお問い合わせください。
ありがとうございました。