見出し画像

Pythonスクリプトをcronで月末日に定期実行させる

はじめに

以前、Pythonスクリプトをmac、Linux系のOSで定期実行させる方法について、ご紹介しました。

今回は、月末日のみ定期実行させたい場合のcronの設定について、まとめます。
設定をするにあたり、エラーも含め備忘録として残していきます。

動作環境

CentOS Linux Version7

設定

例として、月末日の8:30に、/home/xxx/aaaの配下にある、"hello.py"を実行させる場合の設定です。

30 8 28-31 * * /usr/bin/test `/usr/bin/date -d '+1 day' +\%d` -eq 1 && /usr/bin/python3 /home/xxx/aaa/hello.py

下記シェルコマンドを組み合わせて、実行するかどうかを判定していきます。

testコマンド

条件式を評価して真偽の値を返すコマンドです。

今回は、今日の日付を取得し、+1日した日付が1となるかどうかと判定します。

-eq オプションで、整数判定を行うことができます。式は、数値1 -eq 数値2と記述すると、数値1と数値2が等しいかを判定します。

dateコマンド

現在の日時を表示、設定するコマンドです。

-d オプションで、指定された日時を表示します。今回は、今日に1日プラスした日付を表示する、としています。

動作確認

下記の順番で、確認していきました。

1.シェルでコマンドの動作を確認

テスト実行は、1/31 月末日に、それぞれのコマンドの実行状況を確認しました。

$(date -d '+1 day' +%d)

(実行結果)2022年 2月 1日 火曜日 10:27:47 JST

$(date -d '+1 day' +%d)

(実行結果)01

test $(date -d '+1 day' +%d) -eq 1 ; echo $?

(実行結果)0

0、つまりFalseで条件にヒットしてません…。

test コマンドの終了ステータスを、echo コマンドで確認します。また、;(セミコロン)でつなぐことで、複数のコマンドを連続して実行できます。

1つ前の$(date -d '+1 day' +%d)の実行結果を見ると、文字列なのでは?と考え、下記のように変更しました。

test $(date -d '+1 day' +%d) -eq 1 ; echo $?

(実行結果)1

1、つまりTrueになったので、このコマンドでOKそうです。

2.cronに設定

下記のように設定して、自動実行を待ちます。

25 11 28-31 * * /usr/bin/test $(/usr/bin/date -d '+1 day' +%d) -eq 1 && /usr/bin/python3 /home/xxx/aaa/hello.py

定期実行時間になっても、実行されていませんでした。すると、mailが来ていました。

エラーで実行ができないとのこと。
設定を下記に変更し、再度実行を待ちます。

30 11 28-31 * * /usr/bin/test `/usr/bin/date -d '+1 day' +\%d` -eq 1 && /usr/bin/python3 /home/xxx/aaa/hello.py

こちらで、無事実行ができました。

まとめ

今回は、月末日のみ定期実行させたい場合のcronの設定について、まとめました。


この記事が気に入ったらサポートをしてみませんか?