はじめに
cron とは、macOS/Linuxで使える、ジョブ(スクリプト)を自動実行するためのデーモンプロセスです。定期的に実行したいジョブを自動的に実行するよう管理することができます。
python で株価のスクレイピングを毎日実行しているのですが、手動でやるのめんどくさいなぁと思ってた時に見つけて使い始めましたが便利です。今のところ高頻度でいじるものでもないので、備忘として残します。
macOS Mojave 10.14.3
cronの設定
ターミナルで、下記を実行。
$ crontab -e
するとVimが立ち上がる。Vimの使い方は下記を参考にしてくだい。
初めて使うときは焦ります。
Vim初心者に捧ぐ実践的入門
cron の設定は、実行時間とコマンドを半角スペース開けて記述する。保存して閉じると、installing new crontab
とメッセージがTerminalに表示される。
* * * * * 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:00と 20: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で実行してみる。
print('hello')
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 = ''
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'