crontab を使って自動化

Posted on 2019/03/03 in mac , Updated on: 2019/03/30

はじめに

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

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で実行してみる。

# hello.py の中身
print('hello')

crontab 設定

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'