Pythonでクローラー作ってデータ収集なんかをしていると、手動で毎回クローラーを走らせると面倒なので自動で定期的に実行したくなりますよね。
そんな自動での定期実行をやってくれるのがcronなのですが、今回はvagrant環境でcronの設定をする方法を紹介してみたいと思います。
環境
環境は下記の通り。
今回の環境
- Vagrant 2.2.3
- Homestead(Ubuntu 18.04.1 LTS)
- Python 3.6.4
crontab確認
まずは、下記コマンド「crontab -l」でcronのリストを確認します。
$ crontab -l
no crontab for vagrant
今回は上記の通り、crontabはない状態です。
crontab削除
なお、何か既に設定されていて削除したい場合は、下記コマンドで削除することができます。
$ crontab -r
ただし、-rオプションはcrontabの設定全てを削除してしまうので扱う際は十分に注意してください。
cron設定ファイルの確認
では、まずcronに関するファイルを確認してみます。
cronに関するディレクトリやファイルはubuntuの場合、「/etc/」ディレクトリ内にあります。
├── cron.d
├── cron.daily
├── cron.hourly
├── cron.monthly
├── cron.weekly
cron.dにファイルを作成する
ubuntuでは、上記のリストの中にあるcron.dの配下に拡張子のない設定ファイルを作成することでcronを実行することができるので、下記のようにコピーして「mycron」と命名したいと思います。
sudo cp /etc/crontab /etc/cron.d/mycron
問題なく作成できているか確認しておきます。
$ ls /etc/cron.d/ | grep "mycron"
mycron
Pythonファイル作成
続いて定期的に実行したいプログラムファイルを作成します。今回は適当に現在時刻を取得して、その時刻をテキストファイルに書き込むだけのシンプルなPythonファイルを「test.py」と命名して作成してみたいと思います。保存場所は適宜環境に合わせて決めてください。
from datetime import datetime
now = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
file = open('/home/vagrant/code/test.txt', 'w')
file.write(now)
file.close()
Shellファイルの作成
次に上で作成したPythonファイルを実行するためのシェルファイルを作成します。今回は「cron.sh」というファイル名で作成したいと思います。なお、こちらのファイルも適宜、環境に合わせて好きな場所に作成してください。
$ sudo vi cron.sh
今回は下記のようにpythonを実行するようにします。
#!/bin/bash
cd ~/code/python/
python test.py
Cronファイルを編集
続いて、さきほど作成したmycronファイルを編集していきます。
適当にviコマンドかなんかでファイルを開いて、
sudo vi /etc/cron.d/mycron
下記のコードを記述してみたいと思います。
*/1 * * * * vagrant /bin/bash /home/vagrant/code/cron.sh
今回は上記のように1分間隔でvagrantというユーザー名義でcron.shファイルを実行するようにします。
cronログの設定を変更
これで基本的に一通りcronの定期実行は可能なのですが、ついでにcronのログを出すように設定します。
ubuntuの場合、初期設定ではcronのログが出力されないようになっているので、ログを出力するように「/etc/rsyslog.d/50-default.conf」ファイルを編集します。
$ sudo vi /etc/rsyslog.d/50-default.conf
ファイルを開くと下記のコードがコメントアウトされていると思うので、コメントアウト解除します。
cron.*
コメントアウトを外したら保存して、下記で再起動します。
sudo service rsyslog restart
cronの再起動
最後にcronの再起動をして完了です。
sudo service cron restart
まとめ
ということで、今回はvagrant環境にてcronを利用してPythonプログラムを定期実行する方法を簡単に紹介してみました。
今回紹介した方法以外にもcrontabを利用して定期実行する方法もありますが、今回紹介した方法の方がより安全に管理できるかと思います。
てことで、今回はここまで!また!