参考にさせて頂いたところ
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を送信する事があるためというのが実態のようだ。