cron入門 定期実行のためにcrontab編集

Server

業務自動化、定期実行のためには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’.

  1. /bin/nano <—- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /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の実行結果をメールで送信する方法も解説していますので参考にしてください

コメント