2020/04/05

slackの登録とbot起動 終了

今更ながら、slackbotに手を出してみる

参考にさせて頂いたところ
https://se.miyabikno-jobs.com/entrance-labotlatori/

Hubotを使う方法が簡単なようなので、上記を参考に導入

01.slackのアカウント取得
02.Hubotのアプリを追加
03.HubotのAPIトークンを取得
04.pythonのライブラリ slackbotをインストール
   $ sudo apt-get install python-3-pip
   $ sudo pip3 install slackbot
   $ mkdir slackbot
   $ cd slackbot
05. $ touch slackbot_settings.py bot.py botmodule.py
   ・slackbot_settings.py:Botの設定を書くためのファイル(名称変更不可)
   ・bot.py:Botを起動するための実行ファイル(名前は任意)
   ・botmodule.py:Botの応答を記述するためのモジュール(名前は任意)
06.$ nano slackbot_settings.py

# 「API_TOKEN」にはSlackから取得したAPIトークンを記述
API_TOKEN = "XXXXXXXXXXXXXXXXXXX"
# 知らない言葉を聞いた時のデフォルトの応答
DEFAULT_REPLY = "その言葉の意味は学習していません"
# 外部ファイルを読み込む。botmodule.pyを読込
PLUGINS = [
'slackbot.plugins',
'botmodule',
]

07.$ nano bot.py

from slackbot.bot import Bot
# Botを起動する
def main():
bot = Bot()
bot.run()
if __name__ == "__main__":
main()

08.$ nano botmodule.py

from slackbot.bot import respond_to
from slackbot.bot import listen_to
# 「respond_to」はメンションする(@でターゲットを指定すること)と応答する
@respond_to('よろしく')
def greeting_1(message):
# Slackに応答を返す
message.reply('よろしくお願いします!')
# 「listen_to」はメンションがなくても応答する
@listen_to('コニチハ')
def greeting_2(message):
message.reply('コニチハ')

09.$ nohup python3 bot.py &
  ssh接続を切っても稼働するようにnohup ~ &で起動
      再度sshで接続し、プロセスを停止さえたい場合は、
      $ ps x
      にて pyhon3 bot.py のプロセスidを調べて、
  $ kill -9 
     として停止させる。

ログインシェルがsshを閉じる際にSIGHUPを投げるため、プロセスが終了してしまうと思っていた。
nohupはSIGHUPのシグナルハンドラをSIG_IGNに設定、つまり「受信しても無視」する設定にして、コマンドラインで指定されたジョブを実行している。 
nohupで起動した時点ではRUNNNINGだが、端末が閉じられた後、標準入力に対してread()するようなプログラムでは、(5分ごとに読みなおしなどの動作が入るもの)はcloseしてしまっていて、
EOFを返してきてしまう。


nohupを使わなくても停止しないケースもあるようだが、説明が難しい。
非常に詳しくテストされた解説が掲載されている
https://www.glamenv-septzen.net/view/854
実際は、SIGHUPのデフォルト処理はプロセス終了となっており、SIGHUPの受信にかかわらず、プロセスが終了するとき、そのプロセスがセッションリーダーだった場合、カーネルからそのセッションのフォアグラウンドプロセスグループに対してSIGHUPが送信されるらしい。
また、カーネル側で放置しているバックグラウンドジョブに対しても、シェル(bash)側で終了時にSIGTERM/SIGCONTを送信する事があるためというのが実態のようだ。