HubotをRaspberry Piで動作させているのですが、気がつくと停止していることがあります。
その時には、Slack経由で呼びかけても、なんの返事もありません。
家にいれば、アクセスして呼び起こすこともできますが、出先だと手も足も出ません。
長い間泣き寝入りしていたのですが、やっと解決策を見つけました。
## 解決策
定期的にHubot (forever) のログを確認して、DownしていたらHubotをリスタートする
### 詳細
下記のコマンドで動作中のforeverのリストが取得できます。
```bash
`gutter:false;
$ forever list
info: Forever processes running
data: uid command script forever pid id logfile uptime
data: [0] zz4D coffee node_modules/.bin/hubot --adapter slack --name alice 1270 2279 /home/xxxxxx/.forever/zz4D.log 0:11:39:35.111
$
```
実行結果を見ると、ログファイルの場所が記載されています。
ログファイルのパスをgrepで取り出します。
```bash
`gutter:false;
forever list | grep '.*log ' | sed -E 's/.* ([^ ]+\.log).*/\1/
```
ログファイルを見ると、停止している時には、再接続できていないようです。
```text
`gutter:false;
[Wed Jan 31 2018 03:00:12 GMT+0900 (JST)] INFO Connecting...
[Wed Jan 31 2018 03:00:14 GMT+0900 (JST)] INFO Logged in as alice of k28 home, but not yet
[Wed Jan 31 2018 03:00:15 GMT+0900 (JST)] INFO Slack client now connected
[Wed Jan 31 2018 03:00:18 GMT+0900 (JST)] INFO hubot-redis-brain: Using default redis on localhost:6379
[Wed Jan 31 2018 07:30:45 GMT+0900 (JST)] INFO Slack client closed, waiting for reconnect
```
そこで、"waiting for reconnect"があったらrestartさせることにしました。
スクリプトは下記の通りです。
```bash
`gutter:true;
#!/bin/sh
PATH=$PATH:/home/hogehoge/.nvm/versions/node/v4.4.1/bin:/home/hogehoge/.rbenv/shims:/home/hogehoge/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
# get log file path from forever
LOG_FILE_PATH=`forever list | grep '.*log ' | sed -E 's/.* ([^ ]+\.log).*/\1/'`
# chekc is last log is 'Slack client closed, waiting for reconnect'
IS_ALICE_DOWN=`cat $LOG_FILE_PATH | tail -1 | grep 'waiting for reconnect'`
if [ $? -eq 0 ]; then
# write log
today=$(date "+%Y%m%d %H:%M:%S")
echo "[$today] alice is down. Restart alice..." >> /tmp/restart_alice.log
# restart commadn
forever restartall
fi
```
あとは、これをcronに登録して30分おきに実行させるようにしました。
最大で30分程度使えない時があることになりますが、実生活で使う分には問題ありません。
ログを見ると、1日1回程度は止まっているようです。
0 件のコメント :
コメントを投稿