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の設定について、まとめました。
この記事が気に入ったらサポートをしてみませんか?