１台のサーバーで学習を回す時はnohup,screen,tmuxを使おう


この記事は１台のサーバーで回す時の話。５台とか使う様になるといちいちサーバー入ってdocker入って作業して抜けるというアホらしいことをすることになる。その辺は後々自動化していきた。


サーバーで学習を回すと数時間から数日コンソールでログが流れる。
その間パソコンを切れないのは嫌だからコマンドをいちいち作ってた。
ただnohup,screen,tmuxってのがあるらしく他の記事にも書いたのだが便利なので再度メモ。
どれかを使えばいい。


#nohupを使う
サーバー側で学習をさせる場合はnohupを使うとバックグラウンドで動いてくれるので便利
nohupはターミナルの接続が切れた場合にハングアップシグナル（SIGHUP, HUP）という強制終了の命令を無視する。
こんな感じで書く。

```
nohup sh run_minist.sh &
```

nohupの例

```
nohup ping 8.8.8.8 &
jobs
fg %1
cat nohup.out　#ログが見れるが数個一気に学習してた場合は全部合算されるので> log.txtなどして物理で出してもいい。
```

nohupが終わったらメールする

```
(cmd="python train.py";nohup $cmd && (echo $cmd | mail mail@domain.sample -s "Job finish") > ./cmd &)
```

https://orebibou.com/2017/07/nohup%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%95%E3%81%9B%E3%81%9F%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E3%82%B8%E3%83%A7%E3%83%96%E7%B5%82%E4%BA%86%E6%99%82%E3%81%AB/


nohupが終わったらメールしてshut down
gcpなどクラウドで動かしてる場合、一旦閉じちゃう。

```
(cmd="python train.py";nohup $cmd && (echo $cmd | mail mail@domain.sample -s "Job finish" | sudo poweroff ) > ./cmd &)
```


おわった時にslack通知してサーバー閉じる


[10分で出来る]シェルスクリプトの結果をslackに投稿
https://qiita.com/tt2004d/items/50d79d1569c0ace118d6

こいつを使って

```bash:postSlack.sh
#!/bin/sh                                                                                                                              

# postSlack.sh [チャンネル] [Bot名] [本文]                                                                                             

WEBHOOKURL="https://hooks.slack.com/services/hogehoge/hogehoge/hogehoge"

DATA_PAYLOAD=`cat <<_EOT_                                                                                                              
payload={ \                                                                                                                            
    "channel": "$1", \                                                                                                                 
    "username": "$2", \                                                                                                                
    "text": "$3" \                                                                                                                     
}                                                                                                                                      
_EOT_`

curl -s -S -X POST --data-urlencode "${DATA_PAYLOAD}" "${WEBHOOKURL}" > /dev/null
```



```
(cmd1="python train.py";cmd2="/home/hogehoge/postSlack.sh slcak_channel_name user1 "train.pyを400エポックの学習おわたー””; nohup $cmd1 && $cmd2 &)
```

https://cloud.google.com/compute/docs/instances/stopping-or-deleting-an-instance?hl=ja

#screen
ウインドウを仮想で立てれるので、そいつがバックグラウンドで動く。
http://meideru.com/archives/1373
https://gendosu.jp/archives/2417

新しいscreenを作る

```
screen
```

スクリーンを離れる

```
ctrl + a , d
```

screenの状態を確認する

```
screen -ls
```

アタッチ

```
screen -r
```

#tmuxを使う
http://qiita.com/vintersnow/items/be4b29652ff665c45198
http://qiita.com/zwirky/items/adbf22abad7d7822456b

```
brew install tmux
```

セッションは名前付きで作成しよう。後からなんの学習だったのかわからなくなるよ。

```
tmux new -s <session-name>
```

セッションの確認

```
tmux ls
```

上下にペイン(画面)を分割

```
Ctrl-b "
```

左右にペイン(画面)を分割

```
Ctrl-b %
```

セッションにアタッチする

```
tmux attach -t セッション番号
```

デタッチ

```
Ctrl-b d	
```


#コマンドを作る方法
ラズビアンではsystemctlを使ってたのだが、ubuntu14.4ではsystemctlが存在しない。
ubuntu14.10付近からsystemctlに変更されたようだ。それまではupstartを使えとのこと。

<b>ubuntuでデーモンサービス作成には気をつけろ</b>
サーバーでサービス作成をミスすると。。。
OSがぶっこわれたりします。
さくらのサーバーでサービスの設定中で
initctl reload-configurationで反映した瞬間にsudoが使えなくなり
No such file or directorygがでるようになる。理由はbashをプロセスで使ってしまっているから。
sudo: no tty present and no askpass program specified
再起動するとどこのポートもひらいてなくpingが通らない 事態に。。。
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
nmapしても何もでないし、pingも通らないということで再インストール。
他の方法はなかったものか。
サービス作成するときは
<b>仮想環境で１回試す</b>のが安全かと思いました。
環境作成方法
http://qiita.com/miyamotok0105/items/0549316c8ade101ed894


##Upstartとは
Upstartは/ boot / initデーモンのイベントベースの置き換えで、ブート中のタスクやサービスの開始、シャットダウン時のタスクの停止、システムの実行中の監視を行います。 もともとはUbuntuディストリビューションのために開発されましたが、昔ながらのSystem-V initの代わりにすべてのLinuxディストリビューションに展開するのに適しています。


##systemdとは
systemdは、Linuxシステム用の基本ビルディングブロックスイートです。これは、PID 1として実行され、システムの残りの部分を起動するシステムおよびサービス・マネージャーを提供します。

コマンド作成はこっち
http://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff



#参考
http://upstart.ubuntu.com/getting-started.html
http://kotaroito.hatenablog.com/entry/2015/06/20/100240
http://qiita.com/kuni-nakaji/items/f3426bf69be947c594c4
https://heartbeats.jp/hbblog/2013/02/upstart-daemon.html