Edited at

cron の使い方(pythonスクリプト)


はじめに

cron とは、macOS/Linuxで使える、ジョブ(スクリプト)を自動実行するためのデーモンプロセスです。定期的に実行したいジョブを自動的に実行するよう管理することができます。

python で株価のスクレイピングを毎日実行しているのですが、手動でやるのめんどくさいなぁと思ってた時に見つけて使い始めましたが便利です。今のところ高頻度でいじるものでもないので、備忘として残します。

macOS Mojave 10.14.3


cronの設定

ターミナルで、下記を実行。

$ crontab -e

するとVimが立ち上がる。Vimの使い方は下記を参考にしてくだい。

初めて使うときは焦ります。

Vim初心者に捧ぐ実践的入門

cron の設定は、実行時間とコマンドを半角スペース開けて記述する。保存して閉じると、installing new crontabとメッセージがTerminalに表示される。


crontab

*  *  *  *  * command

分 時 日 月 曜日





範囲
0-59
0-23
1-31
1-12
0-7(0と7はSunday)

全てワイルドカード[*]にすると、毎分実行。

また、[ , ]でand、[ / ]でステップ数、[ - ]で範囲を指定できる。


実行例

32 02 * * *            02:32に実行

*/10 * * * *        10分おきに実行
0-10 20 * * * 20:00から20:10まで 1分毎に実行
0,30 20 * * 2,4 毎週,,木曜の 20:0020:30に実行
* 20 * * *         20:00から 20:59まで 1分おきに実行
0 1 * * *         1:00に実行
0 * * * *         毎時 0分に 1時間おきに実行
2 8-20/3 * * *      8:02,11:02,14:02,17:02,20:02に実行


文字コード

出力に日本語が入っていると、下記のようなエラーが発生する。

対応するには、cronにLANG=ja_JP.UTF-8と記述する。

'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)


環境変数

コマンドは、設定ファイルでパスを通していないものに関してはフルパスで指定するかカレントディレクトリからの相対パスで指定しないといけない。


ディレクトリ

cron実行時のカレントディレクトリはホームディレクトリにされるので、絶対パスを指定する。


実行例

上記の注意点を考慮して、デスクトップに置いたhello.pyをcronで実行してみる。


hello.py

print('hello')



crontab(2時に"hello.py"を実行)

LANG=ja_JP.UTF-8

0 2 * * * cd /Users/{ユーザ名}/Desktop/; bash -l -c 'python3 /User/{ユーザ名}/Desktop/hello.py'


指定した時間を過ぎると、terminalに下記のようなメッセージが現れる。これは、/var/mail/{ユーザ名}として出力結果がメール保存されていることを示している。

You have mail in /var/mail/{ユーザ名}


中身を確認する

$ cat /var/mail/{ユーザ名}

 # => hello


おまけ


crontab コマンド

コマンド

crontab -e
cronを設定する

crontab -l
設定されてるcronを表示する

crontab -r
cronは削除する

crontab -u
ユーザを指定する


MAILTO

出力結果をメールして欲しくないとき、もしくは指定のメールアドレスで受け取りたい時。


メール受け取らない(MAILTOをブランクに)

MAILTO = ''

LANG=ja_JP.UTF-8

0 2 * * * cd /Users/{ユーザ名}/Desktop/; bash -l -c 'python3 /User/{ユーザ名}/Desktop/hello.py'



メール受け取る

MAILTO = 'sample@gmail.com'

LANG=ja_JP.UTF-8

0 2 * * * cd /Users/{ユーザ名}/Desktop/; bash -l -c 'python3 /User/{ユーザ名}/Desktop/hello.py'