ホスティングサービス、エックスサーバーのcron設定でpythonのプログラムを定期的に実行する方法

2019年1月3日プログラミング

やりたいことはcronでpythonのプログラムを実行

ブログのホスティングは、エックスサーバーを使っています。

エックスサーバーは、サーバーパネルという画面に「cron設定」という機能が用意されています。これを使うとサーバー上で定期的に実行させたい仕事を登録しておくことができます。

実は、ちょっとした定期的な仕事をcronで実行させたいと考えました。ただしcronに登録したいプログラムはpythonを使って書きたいです。本日は、その方法の備忘録として記事にしたいと思います。

cron設定

SSHでログインする

まずは、pythonの実行環境を用意するためにエックスサーバー上でコマンドラインで仕事が出来るようにします。そのためにSSHを有効にして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

 

上記のスクリプトを仮にファイル名test.shというファイルに格納しておきましょう。cronから直接実行できるように実行権限を付加します。コマンドはchmod u+x test.shです。

サーバーパネルでcron設定する

エックスサーバーのcron追加画面に実行したい時間とプログラムを設定します。

cron追加画面

例えば、毎日特定の時間(例:22時)に実行したい場合は、分→0、時間→22、日→*、月→*、曜日→*のように指定しない部分はアスタリスク(*)を設定します。

コマンドのところには、先程用意したbashスクリプトを以下のように指定します。(server_idのところは、エックスサーバーのサーバーIDというサーバーパネルで確認できる自分のIDです。pwdコマンドでホームディレクトリの名前に使われますので確認しましょう)

/home/server_id/venv/test.sh

コメントは、サーバーパネルで表示するときにわかりやすい名前を付けます。