「アウトプットと言う名の備忘録@Texas」

日本じゃない何処かの脳筋パイソニスタによる何かしらの走り書き

【自動化への備忘録】Crontabで定期的にPythonスクリプトを自動で実行する方法と注意点!

f:id:At_sashimi_py:20190610134533p:plain
定期的に特定のスクリプトCrontabで走らせたい!!

ということがよくあるにも関わらず毎回調べてしまうのでここに記します。

そもそもCrontabとは?

crontab(クロンタブ、あるいはクローンタブ、クーロンタブとも)コマンドはUnixオペレーティングシステム (OS) において、コマンドの定時実行のスケジュール管理を行うために用いられるコマンドである。

つまりLinuxMacを使っている人なら誰でも使える定期的に指定したコマンドを実行できるコマンド。

例えば

定期的なログの取得!

とか

ツイッターで定期的に何かを呟かせたい!

とか

定期的に特定のJiraチケットに対して何かしらのアクションを起こす!

とか

毎日のつまらなく退屈な単純作業は自動化!
atsashimipy.hatenablog.com


などなど、色々と自動化することでかなりの労働量を軽減できる優れもの。

恐怖の全削除コマンドに気を付けろ!

crontabコマンドには複数のオプションがあり、
その一つに全ての設定を削除という恐ろしいコマンド(後述)が存在する。
ガクガクガクガク (((( ;゚Д゚)))ガクガクブルブル
やっと自動化の設定をしたところで間違えて全削除、
会社で共有されているCrontab設定を全削除、
なんてことにならないよう。。。(経験者談)
皆さんはメモなりなんなりして、しっかりコマンドを頭に叩き込んでおきましょう!


オプション一覧
  • オプション -e: cronを設定する
crontab -e
  • オプション -l: 設定されているcronを表示する
crontab -l
  • オプション -r: 悪名高き魔のオプション全crontab設定を削除する基本的に使わないことをお勧めします。なので(今回は触れません) しかもよりによって”r”が”e”(cron設定)のすぐ隣!誘ってんのかっ!!
crontab -r
  • オプション -u: ユーザーを指定する。(今回は触れません)
crontab -u


と、まぁ前置きが長くなりましたが
ここから

Crontab設定方法!とちょっとVim
  • cronを設定する

下記のコマンドをTermnialに入力すると、デフォルトでVimエディタが開きます。

crontab -e

このVimが初心者泣かせのエディタで初めての方は高確率で自滅します。

そしてこのエディットモードから自力脱出もほぼ不可能でしょう。

なので初めての方は下記のコマンドだけ覚えてから帰ってください。

  • まずエディットモードになったら黙ってキーボードの”i”を叩く。これで'InsertMode'に切り替えます。これで普段通り(?)に入力できます。基本Vimでは一切マウスを使いません。
  • そして後述する、Crontabの設定を終えたら、キーボードの”Escape”ボタンを叩いて、InsertModeから脱出!
  • 最後に設定した内容をセーブ+Vimからの完全離脱の呪文”:wq” を入力して、Enter!!ターンっ!!

これで現実世界に帰ってこれるはずです。
もしVimのことをさらに知りたいVimmer希望の方がいらっしゃいましたらこちらのQiitaの記事がとても参考になります。
qiita.com
いつもお世話になっております。

  • 改めてましてcronを設定する

まずはこの図をご覧ください。

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of week (0 - 6)  (日曜日=0)
# │ │ │ │ │                                  
# │ │ │ │ │
# │ │ │ │ │
# * * * * *  実行されるコマンド

#(行頭の # マークはコメント行を示しています)


なんのことだかわかりませんね。

注目すべきは”* * * * *”の部分。
"*"それぞれが左から”分”、”時”、”日”、”月”、”曜日”を表しています。

(時は24時間表記、曜日は0から6まで日曜から土曜。ちなみに7は日曜になります)

その後ろに、実行したいコマンド、(今回はPythonスクリプト)をpathとともに明記します。

例えば

15 14 1 * * 実行されるコマンド

これは毎月1日の午後2時15分に指定されたコマンドを実行します。

他にも何分おきにや何日ごとにという場合は”*/”を使うことでそれが実現できます。

*/2 * * * * 実行されるコマンド

とすると2分ごとにコマンドが実行されます。

Crontab設定表記についてはこちらのサイトで実際に手を動かしながら試すことができます。
crontab.guru

Pythonスクリプトをcrontabで実行する際の注意点

普段コマンドラインpythonスクリプトを実行する際は

python /path/foo.py

としていましたが、
crontabではpython自体のフルパスが必要になります。
(私もこれで長いことハマりました…)

そこで"which"コマンドを使い…

$ which python3
/anaconda3/bin/python3

これでpythonのフルパスが判明しました!
つまりcrontabの設定で必要になるpythonコマンドは

/anaconda3/bin/python3 /path/foo.py


例としてこんなPythonスクリプトを用意しておきました。

import datetime
print(datetime.datetime.now())
print('2分ごとにつぶやくよ')

そして2分ごとにcrontab_test.txtというファイルに書き込むように設定します。

*/2 * * * * /anaconda3/bin/python3 hello_crontab.py >> crontab_test.txt

そしてこの記事を書いている間に…

f:id:At_sashimi_py:20190610085148p:plain
ちゃんと2分ごとに書き込みしていますね!

ここまでくればあとは簡単。
繰り返しになりますが、crontabの内容を表示したいときは、Listの”-l”

crontab -l

設定を削除したいときは、

crontab -r

は使わず

crontab -e

設定でマニュアルで消しましよう!


今回はこれで以上です!

それでは
皆さんの良きpython自動化ライフを祈っております!
ありがとうございましたー!