ホスティングサービス、エックスサーバーのcron設定でpythonのプログラムを定期的に実行する方法
やりたいことはcronでpythonのプログラムを実行
ブログのホスティングは、エックスサーバーを使っています。
エックスサーバーは、サーバーパネルという画面に「cron設定」という機能が用意されています。これを使うとサーバー上で定期的に実行させたい仕事を登録しておくことができます。
実は、ちょっとした定期的な仕事をcronで実行させたいと考えました。ただしcronに登録したいプログラムはpythonを使って書きたいです。本日は、その方法の備忘録として記事にしたいと思います。
SSHでログインする
まずは、pythonの実行環境を用意するためにエックスサーバー上でコマンドラインで仕事が出来るようにします。そのためにSSHを有効にしてSSH経由でログインします。
これを行うには、エックスサーバーのサーバーパネルに用意されている「SSH設定」を使ってSSHログインの準備を行います。
こちらのサイトを参考にさせていただきました。
上記のサイトは、ちょっとサーバーパネルの画面のイメージがちょっと異なります。が、構成が異なるだけである項目は大体同じですね。
以下の説明は、自分のパソコンがUbuntuを使っていることを想定しています。
簡単に言うと、
- サーバーパネルの「SSH設定」でSSHの「状態」をONにする
- 公開鍵認証用鍵ペアの生成。このときにパスフレーズを登録
- 鍵ファイルを自分のUbuntuに~/.ssh/id_rsaとして保存
- SSHコマンドを実行。このときにパスフレーズを入力してサーバーにログイン
という手順になります。一旦鍵ファイルをid_rsaに登録してしまえば、次回からは、SSHコマンド実行+パスフレーズ入力でサーバにログインできるようになります。
pythonの仮想環境を作る
エックスサーバのサーバ上にはpython自体は準備されています。私のアカウントでは/usr/local/bin/pythonというところにpythonが既にインストールされています。ただし、pythonのモジュール管理をしてくれるpipが存在しません。
このままだとpipがないので、プログラムに必要なpythonの他のモジュールのインストールを手軽にできません。そして、pipのインストールもルートの権限がないとできないのです。
そこで、仮想環境を自分のアカウントのディレクトリ以下に作成して、その中に必要なモジュールをインストールしていきます。
pyvenvで仮想環境の構築
エックスサーバーには、pyvenvが用意されているようです。ですので、pyvenv venvのようにvenvという仮想環境を作ることが可能です。(venvは仮想環境に自分でつける名前です)
仮想環境が出来てしまえば、いつものように(?)仮想環境を使用するコマンドsource venv/bin/activateを実行して、有効にします。
仮想環境へpipのインストール
この状態で、pipをインストールします。
コマンドラインで、curl https://bootstrap.pypa.io/get-pip.py > get-pip.pyのようなコマンドを打つと、pipをインストールするためのpythonのスクリプトが取得できます。
このスクリプトを使って、python get-pip.pyと実行すると、pipが仮想環境にインストールされます。
pipで必要なmoduleのインストール
ここまでできればこっちのもの。
後は、必要なモジュールのインストールです。例えば、pip install requestsなどとするとHTTPのrequestを実行するためのモジュールのインストールができます。
これでルート権限がなくても、なんでもお好きなものをインストール可能になりました。自分のプログラムに必要なモジュールを適宜インストールするしましょう。
簡単なbashスクリプトを作る
エックスサーバーのcron設定からは、venvのpythonを指定してスクリプトを実行すれば良いです。が、私は、以下のようなちょっと簡単なbashのスクリプトを作っておきました。(ここでは、実行したいプログラムをtest.pyにしています)
#!/usr/bin/bash
cd ~/venv
source ./bin/activate
python test.py
サーバーパネルでcron設定する
エックスサーバーのcron追加画面に実行したい時間とプログラムを設定します。
例えば、毎日特定の時間(例:22時)に実行したい場合は、分→0、時間→22、日→*、月→*、曜日→*のように指定しない部分はアスタリスク(*)を設定します。
コマンドのところには、先程用意したbashスクリプトを以下のように指定します。(server_idのところは、エックスサーバーのサーバーIDというサーバーパネルで確認できる自分のIDです。pwdコマンドでホームディレクトリの名前に使われますので確認しましょう)
/home/server_id/venv/test.sh
コメントは、サーバーパネルで表示するときにわかりやすい名前を付けます。