---
# System prepended metadata

title: スポットインスタンス再起動時の自動実行 & 通知の方法

---

# スポットインスタンス再起動時の自動実行 & 通知の方法

スポットインスタンスで学習していると、たびたびサーバーを強制的に落とされてしまい、再起動した後に再び学習スクリプトを回さなければなりません

それを自動化する方法を記しました

## サーバー再起動時に学習を勝手に再開するようにする
* 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!"}'
```

![](https://i.imgur.com/rd95aSt.png)

### 再起動時に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: 

![](https://i.imgur.com/LE6uL5z.png)



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