Xserver(Linux)にPythonプログラムを常時実行させる方法を解説!

このブログはエックスサーバーのレンタルサーバーを利用して運営しているのですが、せっかく契約してるのだからブログ用途にだけ使うのはなんかもったいないなーと思っていました。

今回はPythonで作ったプログラムをエックスサーバーに置いて常時実行させていこうと思います。

記事の最後に常駐させられるサンプルコードを貼っとくのでコピペして試してみてください。

Pythonについてよくわからない方やインストール方法が知りたい方は「【初心者向け】Pythonを学習すると何ができるのかとインストール方法を解説」を参考にしてみてください。

【初心者向け】Pythonを学習すると何ができるのかとインストール方法を解説

サーバーにSSH接続する

まず最初にXserverにSSH接続できるようにします。

サーバーパネルにログイン
「SSH設定」をクリック
「SSH設定」の「ONにする」をクリック
「公開鍵認証用鍵ペアの生成」の「パスフレーズ」を入力して「確認画面へ進む」をクリック

ここで設定したパスフレーズがSSHログインする際のパスワードとして使われます。

「生成する」をクリック

クリックすると自動的に秘密鍵のダウンロードが始まります。

その際のファイル名は「自分のサーバーID.key」で保存されています。

ターミナルを開いて「.ssh」ディレクトリを作成
$ mkdir ~/.ssh

ssh関連の設定ファイルを作成しています。

秘密鍵のファイル名を「id_xserver_rsa 」と変更して.sshディレクトリに格納
$ mv ~/downloads/{サーバーID}.key ~/.ssh/id_xserver_rsa 
アクセス権限を変更
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_xserver_rsa

.sshディレクトリのアクセス権限を700、秘密鍵のファイルのアクセス権限を600に変更します。

(700は自分のみ読み書き、実行が可能、600は自分のみ読み書きが可能になります。)

「.ssh」ディレクトリにconfigファイルを作成

ssh接続を簡略化するために設定ファイルを作成します。

$ vi ~/.ssh/config

~/.ssh/configに下記をコピペします。

Host xserver
  HostName {サーバーID}.xsrv.jp
  Port 10022
  User {サーバーID}
  IdentityFile ~/.ssh/id_xserver_rsa
  ServerAliveInterval 60

コピペしたら「:wq」で保存してください。

接続確認してみる

これでSSH接続が可能になったので、「ssh xsrv」とコマンドを叩いて接続確認をしてみましょう。

その際に先程秘密鍵を生成した際に設定したパスフレーズを聞かれるので入力してください。

$ ssh xsrv
Enter passphrase for key '/.ssh/id_xserver_rsa':

Pythonをインストールしてプログラムを常駐させる

確認しておきたい点として、エックスサーバーでは、通常だと契約者にはroot権限が付与されていないのでPythonのライブラリをインストールするためのコマンドであるpipがすぐに使えません。

(他のレンタルサーバーも同様だと思います)

そのため簡単な全体の流れとしてはまずPythonのデファクトスタンダードなパッケージ管理システムであるpipを使えるようにして、そのpipで仮想環境構築&パッケージ管理用ライブラリであるpipenvをインストールしていきます。

そしてその仮想環境に使用したいライブラリ等をインストールして、nohupコマンドでPythonファイルを常駐させるという流れです。

下記の順でそれぞれ説明していきます。

  1. Linux版のAnacondaをダウンロード
  2. ファイルマネージャーから.shファイルをアップロード
  3. エックスサーバーにAnacondaをインストール
  4. condaでpipをインストール
  5. pipでpipenvをインストールして仮想環境を構築
  6. プログラムファイルをエックスサーバーにアップロード
  7. nohupコマンドでプログラムを常駐させる

Linux版のAnacondaをダウンロード

公式サイトからまずAnacondaを落としてきます。

エックスサーバーはサーバー構築にLinuxが使われているのでLinux版をダウンロードしてくる点に注意しましょう。

https://www.anaconda.com/products/individual

ファイルマネージャーから.shファイルをアップロード

ダウンロードしたらエックスサーバーにログインして「ファイル管理」をクリックします。

次の画面で「アップロード」をクリックします

ダイアログに先程ダウンロードしてきたAnacondaファイルを選択して「アップロード」を押せばエックスサーバーにアップロード完了です。

エックスサーバーにAnacondaをインストール

次にターミナルを起動して冒頭で勧めた通りエックスサーバーにssh接続しましょう。

無事ログインできたら、ルートディレクトリでshコマンドを叩いて先程アップロードしたAnacondaのインストーラーを起動します。

そうする事で、エックスサーバーにAnacondaをインストールできます。

$ sh Anaconda3-2021.05-Linux-x86_64.sh

これでAnacondaに内包されているPython本体と、Anacondaのデフォルトパッケージ管理システム、condaが利用可能になります。

condaでpipをインストール

先程Anacondaをインストールしたことでcondaコマンドが使えるようになったのでそれを使ってpipをインストールします。

pipはcondaとは別のパッケージ管理システムで、違いとしては下記が挙げられます。

pipconda
Python公式のパッケージ管理システムAnaconda純正のパッケージ管理システム
PyPI(Python Package Index)というオープンソースのリポジトリからパッケージがインストールされるAnaconda社が管理するリポジトリからパッケージがインストールされる
パッケージの種類が多いパッケージの種類が少ない
オープンソースなので必ずしも安全は保証されないAnaconda社管理なのである程度安全性は担保できる。

今回はpipでしかインストールできないpipenvというパッケージを使用したいのでpipをインストールしていきます。

$ conda install pip

これでようやくエックスサーバー内でpipコマンドが使用可能になりました。

pipでpipenvをインストールして仮想環境を構築

次に実際にPythonファイルを稼働させる仮想環境を構築します。

今回仮想環境構築にはpipenvを使用していきます。

pipenvは仮想環境構築と同時にインストールされたパッケージの管理も同時にできてしまう便利なライブラリです。

まずは任意のディレクトリを作成移動の後、仮想環境を作成して環境に入ります。

$ mkdir hoge
$ cd hoge
$ pip install pipenv
$ pipenv shell

$マークの後ろに括弧でディレクトリの名前が表示されていれば仮想環境に入れています。

この段階で常駐させるPythonプログラムに使用するライブラリがあれば、インストールしましょう。

pipenvで作成した仮想環境内でライブラリをインストールするには、pipenv installコマンドを使います。

pipenvでインストールできるパッケージはpipと全く同じです。

(hoge) $ pipenv install 使いたいパッケージ

仮想環境内にあるPipfileを確認してライブラリがインストールされていたらOKです。

(hoge) $ cat Pipfile

仮想環境から抜けるには環境内でexitと叩きます。その際に括弧で囲まれたディレクトリ名が消えたら無事に抜けれています。

(hoge) $ exit
$ 

プログラムファイルをエックスサーバーにアップロード

先程.shファイルをアップロードしたようにファイルマネージャーのダイアログから稼働させるプログラムファイルをアップロードします。

これでプログラムを常駐させる準備が完了しました。

nohupコマンドでプログラムを常駐させる

今の状態のサーバー内でpython hoge.pyといった感じで普通にプログラムを実行するとssh接続を切断したり、端末を閉じたりすると処理が止まってしまいます。

端末を閉じたりログアウトしたりしても処理を裏で続行させるためには「nohup」コマンドを使います。

(hoge) $ nohup python3 hoge.py &

デフォルトではプログラム稼働時の出力はnohup.outに出力されます。

出力するファイルを指定したい場合はファイル名を指定してあげましょう。

(hoge) $ nohup python3 hoge.py > output1.txt &

プログラムが本当に裏で稼働しているかは「ps」コマンドで確認することができます。

psコマンドは裏で実行中のプロセスを表示することができるコマンドです。

(hoge) ps -aux | grep python

grep pythonの箇所がコマンドの内容になっていて、ここにpythonプログラムを実行したときのコマンドが表示されていれば、裏でプログラムが動いています。

(hoge) $ ps -aux | grep python
hoge   95648  0.0  0.0 187948 52840 pts/1    S    21:22   0:00 python3 hoge.py

プログラムを停止させるには「kill」コマンドを使用します。

psコマンドで表示された際の左から2番めの数字がプロセスidになっていて、それを指定してkillコマンドを叩くとプログラムが停止します。

(hoge) $ kill 95648

再度psコマンドで確認してみるとプロセスが消えていると思います。

サンプルコード

import schedule
import time
import datetime

def main():
    now = datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M:%S')
    print(now)

if __name__ == "__main__":
    main()
    # 1分毎に実行
    schedule.every(1).minutes.do(main)
    while True:
        schedule.run_pending()
        time.sleep(1)

1分ごとに現在時刻を出力する単純なプログラムです。

while文で無限ループさせてscheduleライブラリで1分ごとにmain関数を実行させています。

catコマンドで出力されたログの中身を確認できるので試してみてください。

(hoge) $ cat nohup.out

おわりに

今回はエックスサーバーにPythonファイルをアップロードして常時稼働させる方法を解説してみました。

この方法を覚えると例えばスクレイピングのプログラムをアップロードしておいて決まった時刻に実行して結果をLineに通知する、等の応用をすることができてすごく便利です。

ちなみに僕はサーバー上にTwitterAPIを利用して開発した自作Botを常時稼働させて遊んでいます。

このブログでは他にもPython関連の記事を上げているのでよければ読んでみてくださいー。

【Python初心者向け】形態素解析とマルコフ連鎖を使ってひろゆきっぽい文章を生成してみた

【必読】Pythonで仕事を取りたければ絶対読んでおきたいおすすめ技術書を紹介!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です