1時間おきにpythonプログラムを実行させたいとする。
例として1時間おきに更新される情報をスクレイピングしたい場合などである。
その様な場合、例えばfor文で回して処理の最後にtime.sleepすることで対応できる。
ただ、これは処理を実行させ続けるという意味でリソースの無駄遣いである。
この様な場合はtime-based schedulerでプログラムの実行管理ができる。
このtime-based schedulerとしてUNIX系ではcronが使える。
#####その際には以下が必要になる。
- 実行するプログラム(pythonプログラム)
- いつそのプログラムが実行されるかを指示するファイル(crontab)
本記事に含まれる内容
- crontabの書式
- cronの実行手順
crontabの書式
cronではまずcrontabを用意する必要があり、cronを管理するconfigファイルの様なものである。書式は以下の通りである。以下を見ても明らかな通り、最短の実行間隔は1分である。
# +------------ minute (0 - 59)
# | +---------- hour (0 - 23)
# | | +-------- day of the month (1 - 31)
# | | | +------ month (1 - 12)
# | | | | +---- day of the week (0 - 6) (Sunday=0)
# | | | | |
# * * * * * command to execute
毎日、0時0分に実行したい場合は以下となる
0 0 * * *
30分おきに実行したい場合は以下となる
0,30 * * * *
オフセットが違うだけで以下も30分おきの実行となる
15,45 * * * *
月曜日の午前6時40分のみ実行したいとする
40 6 * * 1
午前9時から午後6時まで30分おきの実行をしたい場合は以下である
0, 30 9-18 * * *
毎時10分おきの実行をしたい場合は以下である
0-59/10 * * *
予め用意されている定義もある
以下は1月1日の24時に実行される(= 0 0 1 1 *)
@yearly command
以下はrebootされる度に実行したい場合
@reboot
cronの実行手順
実行するpythonプログラムとして以下を用意する。
実行内容としてはtimeスタンプ結果を名前とするディレクトリの作成である。
import os
import time
print('Now : ', time.time())
os.mkdir(str(int(time.time())))
上記のファイルを毎分実行したいとする。
ここでcronを使うため、crontabを編集モードで開く。
$ crontab -e
内容を確認する場合は以下の引数となる。
$ crontab -l
実行ファイルを毎分実行したい場合は以下の通り。
* * * * * cd {実行ファイルの保存先} && python mkdir.py
cronはsh shellを使っており低レベルのエイリアスがわからない場合がある。
例えばファイル実行時にpython3を用いる場合はpython3の場所を絶対pathで示す必要がある。
以下でpython3の場所を取得し、
$ whereis python3
取得したpathは以下の様に記載する。
* * * * * cd {実行ファイルの保存先} && {python3の絶対パス} mkdir.py
一方、cronはback ground processなのでmkdir.py内のprint関数の出力は目視で確認できない。以下とすることで、print関数の出力をlogファイルに出力できる。
* * * * * cd {実行ファイルの保存先} && python mkdir.py >> mkdir.out
以上までで、crontabの編集は終了しており、毎分の書き込まれるlogファイルの内容は以下のコマンドで確認できる
$ tail -f mkdir.out