本記事はPythonで作成したSlackbotのプロセスを永続化する方法について説明するものです。

Slackbotを通常の起動方法でする場合、以下のコマンドをターミナルから実行しますが、ターミナルを閉じた場合はSlackbotのプロセスも終了してしまいます。

python bot.py

自PCで起動する場合はそこまで問題となりませんが、サーバー上で永続的に起動しておきたい場合には不便です。
ターミナルを閉じた後も動作させるためには、foreverコマンドなどを活用してプロセスを永続化する必要があります。

PythonによるSlackbot作成については「SlackbotをPythonで作成しよう」をお読みください。

foreverコマンドを使用してSlackbotのプロセスを永続化する

プロセスを永続化する為には「forever」と呼ばれるコマンドを使用します。
foreverコマンドはnode.js用のコマンドですが、オプションを指定すればpythonも永続的なプロセスとして起動可能です。

foreverコマンドのインストール方法

npmコマンドでインストールします。

npm install forever -g

foreverコマンドの実行方法

foreverコマンドは以下のように実行します。

forever [オプション] [プロセス化したいコマンド]

pythonコマンドを実行する場合は「-c」オプションを指定します。

forever -c python bot.py

foreverは「forever list」と打ち込みます

data: uid command script forever pid id logfile uptime
data: [0] abc0 python bot.py  12345 12345 /Users/super/.forever/abc0.log 0:0:0:36.361

foreverプロセスは起動した順にプロセス番号が0から割り振られます。

data: [0] abc0 python3 bot.py 
data: [1] def1 python3 bot.py
data: [2] ghi2 python3 bot.py

0を削除した場合は、0が欠番になるのではなく、1が0に、2が1と上にずれるので注意が必要です。

data: [0] def1 python3 bot.py xoxb-XXXXXXXXXXXXXXXXXXXXXXXXXXXX
data: [1] ghi2 python3 bot.py xoxb-XXXXXXXXXXXXXXXXXXXXXXXXXXXX

Slackbotの起動をシェルスクリプト化する

foreverコマンドの操作はスクリプト化しておくと便利です。

◆起動(bot_start.sh)

#!/bin/sh
forever start -c python3 bot.py

◆停止(bot_stop.sh)

#!/bin/sh
forever stop 0

◆再起動(bot_restart.sh)
両方呼ぶことで再起動できます。

#!/bin/sh
./bot_stop.sh
./bot_start.sh

Slackからシェルスクリプトを操作してBotを再起動する

Botのコードを修正した場合、反映させる為にはBotを一度停止して再起動する必要があります。

SlackからBotを起動は不可

SlackにログインしていないBotに対して指示はできません。よってBotに対してSlackから起動を指示することもできません。

SlackからBotを停止する

SlackからBotを停止することは可能です。
しかし、停止後はSlackからログアウトしてしまいます。
前述の通りBotはSlackから起動する方法がないため、起動する為にはサーバーにログインして直接スクリプトを実行する必要があります。

Slackから再起動する

停止と起動を同時に行える再起動スクリプトがSlackから起動できれば、Slackからコードを反映しつつ、サーバーにログインせずにコードの修正を反映できます。

シェルスクリプトを操作して起動・停止・再起動する方法

Pythonでシェルスクリプトを操作するためには「os」というライブラリを使用します。
「os.system」でシェルコマンドを実行できます。

os
os.system(‘[シェルコマンド]’)

以下のコードをbotmodules.py加えておきます。

これでOKかと思ったら?



Botが起動できませんでした。
途中でプロセスが切れるとスクリプトも落ちてしまう模様です。
ちなみにnode.jsは上記でもうまくいきます。

ということで、新しいプロセスを起動するまで古いプロセスを残しておく必要があります。
先に新しいプロセスを立ててその後でプロセスを終了させることで更新を反映したBotのみを起動できます。

「./bot_start.sh」と「./bot_stop.sh」の順番を入れ替えます。

◆再起動スクリプトの修正(bot_restart.sh)

#!/bin/sh
./bot_start.sh
./bot_stop.sh

起動できました。
SlackからBotの再起動

以上、Slackbotのプロセスを永続化する方法とSlackからのスクリプト制御方法でした。

Slackbot+PythonまとめTOP>>Slackbotの作り方マニュアル〜Python編〜