業務自動化、定期実行のためにはcronが必須です
pythonファイルはもちろん、サーバーのlinuxコマンドも設定できます
crontabで実行ファイルを編集して、定期実行コマンドを設定していきます
・サーバー時間の確認、設定
date
2024年 9月 12日 木曜日 22:06:32 JST
現在の時刻が表示されればOK
違うときはタイムゾーンを確認
timedatectl | grep 'Time zone'
Time zone: UTC (UTC, +0000)
日本に設定するときは以下のコマンドで設定
sudo timedatectl set-timezone Asia/Tokyo
これでサーバー時間の設定が完了
・cronの状態確認、設定
cronの状態を確認します
sudo systemctl status cron
次のような結果が表示されます
activeであればcronが実行できます
● cron.service - Regular background program processing daemon
Loaded: loaded (/usr/lib/systemd/system/cron.service; enabled; preset: enabled)
Active: active (running) since Mon 2024-10-07 12:16:48 JST; 1 month 13 days ago
Docs: man:cron(8)
Main PID: 755 (cron)
Tasks: 1 (limit: 1067)
Memory: 2.8M (peak: 39.6M swap: 152.0K swap peak: 248.0K)
CPU: 32min 6.312s
CGroup: /system.slice/cron.service
└─755 /usr/sbin/cron -f -P
inactiveであれば次のコマンドで起動します
sudo systemctl start cron
ちなみにcronの停止は以下のコマンドです
sudo systemctl stop cron
cronの実行ログを見るコマンドはこちら
-rオプションで最近のものだけ表示、-uオプションでcronのログをしています
sudo journalctl -r -u cron
・crontabの設定
crontabを確認します
crontab -l
crontabの追加は以下の編集コマンドから
crontab -e
初めての操作の時は以下のメッセージが出ます
Select an editor. To change later, run ‘select-editor’.
- /bin/nano <—- easiest
- /usr/bin/vim.basic
- /usr/bin/vim.tiny
- /bin/ed
Choose 1-4 [1]:
自分はおすすめのnanoエディターで編集します
・pythonファイルの実行
最後の行に追加したい内容を入力します
0 5 * * * /usr/bin/python3 /home/user/test.py
毎日5時0分にpythonでtest.pyを実行するという設定です
ここでポイントはpythonのパスと実行ファイルのフルパスを入力することです
pythonのパスの確認方法
which python3
/usr/bin/python3
実行ファイルのフルパスの確認方法
readlink -f test.py
/home/user/test.py
・cronでcertbot自動更新
cronを使って、certbotを自動更新するコマンドを実行します
まず、certbotの更新にはroot権限が必要なので、rootユーザーになります
sudo su
crontabを-uオプションで、rootユーザーで編集します
crontab -u root -e
定期実行するコマンドを入力します
2>&1は、標準エラー出力2を標準出力1と同じ設定にするというコマンドです
さらに、更新したメールを送って、nginxを再起動するコマンドも書いておきます
# 毎月1日の6時に実行
00 06 01 * * certbot renew && systemctl restart nginx
ちなみにこのコードの&&は、certbot renewが成功した場合、次のコマンドに進みます。失敗した場合、後続のコマンド(systemctl restart nginx)は実行されません
certbot renewの結果に関係なく、systemctl restart nginxを実行したいなら、&&の代わりに;を使用します
00 06 09 * * certbot renew; systemctl restart nginx
あとで気づいたのですが、&&や;を使うとcertbot renewが更新をスキップしても、systemctl restart nginxが毎回実行されます
この無駄な再起動を避けるには、–deploy-hookを使用する方法があります
00 06 09 * * certbot renew --deploy-hook systemctl restart nginx
–deploy-hookは、Let’s Encryptのクライアントであるcertbotを使用するときに指定できるオプションで、証明書が更新された後に実行するスクリプトやコマンドです
以下の記事でcronの実行結果をメールで送信する方法も解説していますので参考にしてください
コメント