このブログはエックスサーバーのレンタルサーバーを利用して運営しているのですが、せっかく契約してるのだからブログ用途にだけ使うのはなんかもったいないなーと思っていました。
今回はPythonで作ったプログラムをエックスサーバーに置いて常時実行させていこうと思います。
記事の最後に常駐させられるサンプルコードを貼っとくのでコピペして試してみてください。
Pythonについてよくわからない方やインストール方法が知りたい方は「【初心者向け】Pythonを学習すると何ができるのかとインストール方法を解説」を参考にしてみてください。
【初心者向け】Pythonを学習すると何ができるのかとインストール方法を解説目次
サーバーにSSH接続する
まず最初にXserverにSSH接続できるようにします。
ここで設定したパスフレーズがSSHログインする際のパスワードとして使われます。
クリックすると自動的に秘密鍵のダウンロードが始まります。
その際のファイル名は「自分のサーバーID.key」で保存されています。
$ mkdir ~/.ssh
ssh関連の設定ファイルを作成しています。
$ mv ~/downloads/{サーバーID}.key ~/.ssh/id_xserver_rsa
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_xserver_rsa
.sshディレクトリのアクセス権限を700、秘密鍵のファイルのアクセス権限を600に変更します。
(700は自分のみ読み書き、実行が可能、600は自分のみ読み書きが可能になります。)
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ファイルを常駐させるという流れです。
下記の順でそれぞれ説明していきます。
- Linux版のAnacondaをダウンロード
- ファイルマネージャーから.shファイルをアップロード
- エックスサーバーにAnacondaをインストール
- condaでpipをインストール
- pipでpipenvをインストールして仮想環境を構築
- プログラムファイルをエックスサーバーにアップロード
- 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とは別のパッケージ管理システムで、違いとしては下記が挙げられます。
pip | conda |
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で仕事を取りたければ絶対読んでおきたいおすすめ技術書を紹介!