この記事は1台のサーバーで回す時の話。5台とか使う様になるといちいちサーバー入って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 &)
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
こいつを使って
#!/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 &)
#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を使えとのこと。
ubuntuでデーモンサービス作成には気をつけろ
サーバーでサービス作成をミスすると。。。
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も通らないということで再インストール。
他の方法はなかったものか。
サービス作成するときは
仮想環境で1回試すのが安全かと思いました。
環境作成方法
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