今回初めてCronジョブに挑戦しました。備忘録です。
Cronジョブとは
Cron(クーロン)ジョブとは、設定された時間になるとコンピュータが自動でスクリプトを走らせ仕事をしてくれるものです。Windowsのタクスケジューラーに当たります。例として、定期的に行うデータのバックアップ、データのアップロード/ダウンロードなどを、利用が少ない夜間のタイミングにスケジューリングしておくことができる。
ジョブをスケジュールする
Crontabでスケジューリング
ターミナルで次のコマンドを実行し、クーロンタブを開く。「-e」はedit(編集)の意。
crontab -e
クーロンタブには下記の要領で入力。
* * * * * (コマンド/スクリプト)
- - - - -
| | | | |
| | | | +----- 曜日を0から6で入力(日曜日(=0)から始まる)
| | | +------- 月を1 から 12で入力
| | +--------- 日にちを1 から 31で入力
| +----------- 時間を 0から23で入力
+------------- 分 を0 から 59で入力
- クーロンタブが編集できない時は、aキー(append)またはiキー(insert)を押す。
- 編集後は、Escキー、コロン(;)キー、wキー(Writeの意)、qキー(Quitの意)を押すとクーロンタブを抜けられる。
アスタリスク5つ及び実行したいコマンド/スクリプトだ。この5つのアスタリスク及びコマンド/スクリプトの間にはそれぞれに半角スペースを入れる。
アスタリスクは全てを表す。例えば、毎週日曜日、午前0時10分にジョブを走らせたい場合は、下記のようになる。
10 0 * * 0 (コマンド/スクリプト)
スケジューリングはもっと細かく設定できるので、必要に応じて調べればOK。
簡単なテストをしてみる
いきなりスクリプトを走らせる前に、echoでメッセージを表示させてみる。 下記は、23時55分に"Hello"と表示させるスクリプト。
55 23 * * * echo "Hello"
- クーロンタブを抜けると、ターミナルからアドミンなんとかのメッセージが出るので、「OK」で進める。
- スクリプトを保存したら、ターミナルに "crontab: installing new crontab"(クーロンタブ:新しいクーロンタブをインストールしています)のメッセージが出ていることを確認。出ていない場合は、権限に問題がある。
私はこちらの記事を参考に権限設定した。
ジョブ実行時刻である23時55分を過ぎたところで、ターミナルを起動すると、"You have mail"のメッセージが。メールを確認する。
mail
23時55分に実行されたメールを開くと、「Hello」のメッセージがプリントされている。
Python ファイルをクーロンジョブで実行する
上記では、クーロンジョブで実行するコマンドを直接入力したが、今度は、.pyファイルを実行する。 クーロンジョブでPythonコードを走らせるには、.pyファイルのトップに次の1行を追加する必要がある。これにより「このファイルはPythonで実行してね」と実行プログラムを指定する。#!/usr/bin/env python
また、クーロンタブでジョブを設定する際に、Pythonのパスを渡す必要がある。
今回、私はpyenv環境を使ったため、pyenvコマンドにてPythonパスを確認する。
pyenv which python
ここで確認したPythonのパスをクーロンタブで使用する。
* * * * * (Pythonパス) (実行するスクリプトのパス)
下記は実行例
23 55 * * * /usr/bin/python3 /path/to/myscript.py
私は今回、.pyファイルの中で、ファイルをエクスポートするコマンドを記載しておいたのだが、このエクスポート先も絶対パスで記載する。そうしないと、HOMEディレクトリにファイルが出来てしまった。
また、.pyファイル内に、printを入れておけば、コードがどこまで進んだかを、先述したしたmailから確認できる。あるいは、更新時刻から、コードの実行状況を確認出来る。