# スポットインスタンス再起動時の自動実行 & 通知の方法
スポットインスタンスで学習していると、たびたびサーバーを強制的に落とされてしまい、再起動した後に再び学習スクリプトを回さなければなりません
それを自動化する方法を記しました
## サーバー再起動時に学習を勝手に再開するようにする
* Linuxサーバーであれば、`/etc/rc.local`というファイルに、起動時に実行して欲しいコマンドを書くことができる
* 権限で怒られるので`sudo vi /etc/rc.local`とかで編集する
* 例えば`~/stylegan_chainer_docker`ディレクトリで、dockerを使って訓練再開したい場合は下のように書き込めば良い
##### /etc/rc.local
```bash
#!/bin/sh -e
cd stylegan_chainer_docker
docker-compose up -d train
exit 0
```
* -dオプションで作ったコンテナのログは、そのディレクトリに移動した上で`docker-compose logs -f --tail=500 train`みたいにすれば見られる
* `--tail`は末尾何行まで表示するか
* ちなみにここにすぐには終わらない処理(例えば上で-dを付けない)を書いてしまうと、最悪サーバーが永遠に起動しなくなるので注意
* 一回これをやらかしたが、AWSさんは起動してくれたのでそこのケアはしてくれてそう
* 当然だがこれをやるには、学習スクリプトに最新の重みを自動でロードする機能がないといけない
## サーバーの再起動時に新しいIPアドレスをSlackで通知
* いちいちAWSのコンソールを覗かなくて良くなる
* スマホにsshクライアントのアプリを入れておけば、出先でパッと再起動時の処理ができる
など地味に便利
### シェルからSlackに通知を送る方法
1. [ここ](https://algoageex.slack.com/apps/new/A0F7XDUAZ--incoming-webhook-)でどのチャンネルにPOSTするか決める -> インテグレーションの追加
2. Webhook URLをコピー
3. 下のcurlでチャンネルに投稿されるはず
```bash
$ curl -X POST \
<2でコピーしたURL> \
-H 'Content-type: application/json' \
-d '{"text":"Hello World!"}'
```

### 再起動時にIPアドレスを通知
上のcurlを`/etc/rc.local`に追加すれば良い
ちなみに`username`や`icon_emoji`で見た目のカスタマイズができる
##### /etc/rc.local
```bash
#!/bin/sh -e
MESSAGE="Server Restarted!!!"
IP=`curl inet-ip.info`
# 再起動の通知
curl -X POST \
<webhookのURL> \
-H 'Content-type: application/json' \
-d "{
\"text\":\"${MESSAGE}\",
\"username\":\"StyleGan\",
\"icon_emoji\":\":sunglasses:\"
}"
# IPアドレス
curl -X POST \
<webhookのURL> \
-H 'Content-type: application/json' \
-d "{
\"text\":\"${IP}\",
\"username\":\"StyleGan\",
\"icon_emoji\":\":sunglasses:\"
}"
exit 0
```
こんな感じの通知が来る :sunglasses:

## 参考
* [SlackのIncoming Webhooksを使い倒す](https://qiita.com/ik-fib/items/b4a502d173a22b3947a0)
* [linux起動時に自動的に実行するコマンド(プログラム)の設定](https://qiita.com/hnishi/items/6a5b8b67d807f8dfe44e)