LoginSignup
0
3

More than 3 years have passed since last update.

時間のかかるPythonスクリプトを定期実行させる

Last updated at Posted at 2019-08-16

環境

macOS version 10.14.6
Ubuntu 16.04 in AWS
Python 3.5.2

前提

AWSのEC2インスタンスを使って、自動的にスクリプトを起動するcron jobを作りました。
本来は、
・AWS Lambda
・ECS Scheduled Tasks
等を使うのが得策だとは思いますが、

①今回実行するスクリプトが丸一日くらいかかる(Lambdaは15分が限界との噂)
②手っ取り早く、安く済ませたい

との考えがあり、少しレガシーかもしれないですが、シンプルなcrontabを使用することにしました。
本当はDocker環境とかを構築したかったのですが、初心者で且つ時間の都合上、EC2に収まってしまいました。
より良い方法等あれば、ぜひ教えて頂ければと思っております。
cronの選定に関しては、下記などを参考にしました。
https://medium.com/better-programming/cron-job-patterns-in-aws-126fbf54a276

1, EC2インスタンスに接続

インスタンスは作成済みとの前提で進めていきます。今回は上記の環境で動かしていきます。
ターミナルで、

$ ssh -i ~/directory/directory/sample.pem ubuntu@IPv4 パブリックIP

ssh接続でサーバーにログインします。
ubuntuの部分は、AMI(サーバーの種類?)によって変わるので、気をつけてください。
余談ですが、ファイル・フォルダのパスがわからない場合は、そのファイル・フォルダをターミナルにドラッグ&ドロップするとフルパスが表示されるみたいです。当たり前すぎるかもしれないですが、初心者の私は割と重宝しています・・・

2, Pythonをインストール

サーバーにPythonをインストールしていきます。Ubuntu環境なので、aptコマンドを使っていきます。
念の為、

$ sudo apt update
$ sudo apt upgrade

を実行しておきます。


以下でPythonをインストールしていきます。

$ sudo apt install python3 python3-pip python3-dev

最低限ここまではどの人も共通してインストールするのかなと思っております。
あとは、使うモジュール等によって必要なものがあると思うので、その都度インストールすればいいかと思いました。
今回私は後述するモジュールを使うために、以下のものもインストールしました。

$ sudo apt install libmysqlclient-dev libffi-dev libssl-dev build-essential

もしかしたら、いらないものも含まれてるかもしれません。

3, モジュールをインストール

今回のスクリプトで使ったのは以下のモジュールだったので、サーバーで使えるようにインストールします。

$ pip3 install requests sqlalchemy selenium lxml paramiko eventlet mysqlclient

4,crontabを編集する

EC2にはcron jobのための機能がもともと入ってるみたいなので、以下のコマンドを入力すると、cronに関する記述ができる編集画面に移行します。

$ crontab -e

気をつけないといけないのが、$ crontab -rとすると、全てのcrontabのデータが消えるみたいなので、設定してからは、気をつけないと苦労が水の泡になるそうです。私は毎回指差し確認しながら実行しています・・・。

余談ですが、初心者の私がビビったのは、編集画面をVimにしてしまったこと。泣きそうになりました。
nanoがなんだかんだわかりやすかったので、怖い方はnanoを使ったほうがいいとは思います。
editorは以下で後からでも変えれます。

$ select-editor



それではcrontabに記述していきますが、書き方はいろいろあるので、要件にあった内容を調べたほうがいいと思います。今回私は以下のようにしました。
0 20 * * * python3 /insert-fullpath/sample.py >> /insert-fullpath/cron_log.txt 2>&1
上記は「毎日20時にsample.pyを起動する。出力されたもの、さらにエラーが出た場合は予め作っておいたcron_log.txtに書き込んでください」という指示です。
とにかく、起動しているかわからず怖かったので実行結果がわかるように上記のようにしました。
ちなみに、保存した上記crontabのファイルは、ターミナルの指示に従って、何も操作せずに保存すると/var/spool/cron/crontabs/bitnami/に存在していました。

5, タイムゾーンの設定

デフォルトだとサーバーはロンドン時間になってると思うので、タイムゾーンも確認しておきます。

$ timedatectl

上記で現行のタイムゾーンを確認

$ sudo timedatectl set-timezone America/Vancouver

これで、バンクーバー時間になると思います。

おわりに

社内でブラウザテストのスクリプトを起動させるために、今回初心者ながらいろいろ試してみました。本当はLambdaやDockerなどの技術を使いたかったのですが、力及ばず。
よりよい方法やお気づきの点がありましたら、お声がけ頂けると大変嬉しいです。

今働かしていただいている会社のサービスも、ぜひ御覧ください!
サッカー順位表 FootyStats

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3