時代に追いつくMining Log

マイニングが流行ってから一足遅れて世界に飛び込んだ人の日々の記録と成長を記録していきます

ネットワークの安定化と自動再起動のshellスクリプトの完成

えっとですね、大きいことが2つ片付き、rigがかなり安定稼働したのでその詳細について書きます。

 

まず、今まで起こっていたブロードキャストストームがあんまり起こらなくなりました。あんまり確証はないのですが、とりあえず最後に行った処理を書き留めておこうと思います。

 

 結局は原因はしっかりとは分からなかったのですが、やったことといえば、127.0.0.1を止めた事です。これでわかる人は、手順とか書くんですが読み飛ばしちゃって構いません。autorebootのこのに関しては、ちょい下に書くので。

 

機能の止め方としては、静的IPを書き込んだファイル(etc/network/interfaces)の中に書かれている一部をコメントアウトします。

具体的には

auto lo

iface lo inet loopback

この二行です。loopbackとは何か、要はlocalhostのコマンドの際に指定されるIPの事です。仮想的に自分自身に向けたネットワークを構築するためのコマンドです。

普通に使用するPCの場合は、localhostのコマンドが使用できなくなるなどの不具合が多く発生しますが、ethOSでのマイニングにおいては、loopbackは使用しないためコメントアウトしても特に不具合は発生しません。

 

なんでこれをコメントアウトしたら安定したのかはよく分かりませんが、とりあえず安定したのでよかったです。まあ、また発症したらその時考えます。

 

 

そんでもって、今回の本題である自動再起動のshellスクリプトに関してです。

具体的に何をする処理を書いたかというと、show minerで参照されるファイルに直接アクセスし、マイニングの状況をbash(shellスクリプト)で監視します。そんで、追加された時はその追記分の文字列からerror関連の物が吐かれてないかを文字列部分一致にて監視し、吐かれていた場合はrのコマンドの際に使われはshellスクリプトまで直接アクセスして実行します。

 

コードはコメントとかデバッグのために書いたコメントとか汚いですが我慢してください。自分でもぐちゃぐちゃしてて解読するのに大変なんです。
 

#!/bin/sh 
#dirは最終的にminer.output 
dir=/var/run/miner.output 
dirlist=./list 
 
#listはチェックリスト ここで配列を作成 
IFS=$'\n' 
file=(`cat "$dirlist"`) 
 
 
#ファイル上書き確認のための関数 
update(){ 
        echo `openssl sha256 -r $1 | awk '{print $dir}'` 
} 
 
 
#監視間隔 
INTERVAL=1
lastcount=`cat $dir | wc -l`
last=`update $dir`
while true;
do
        sleep $INTERVAL
        current=`update $dir`
        currentcount=`cat $dir | wc -l`
        if [ "$last" != "$current" ];
        then
                #変更を確認した際、このthen内が実行される
                #echo "find change!"
                
                tempminer=$last
                tempminer=${tempminer#$current}


                #変更された行数         
                count=`expr $currentcount - $lastcount`
                

                #echo "$count"
                
                for((i=0;i < $count; i++)); do
                        #echo "`cat $dir | head -$currentcount | tail -`expr $lastcount + $i``"

                        #更新された行数を上から一行ずつ代入していく
                        tempcount=`expr $lastcount + $i + 1`
                        

                        #更新された内容を上から1行ずつ
                        templine="`head -n $tempcount $dir | tail -n 1`"



                        for((j=0;j < ${#file[@]}; j++));do
                                filetemp=${file[$j]}
                                #echo ""
                                if [ `echo $templine | grep $filetemp` ]; then
                                        #リストと一致するものが存在した場合then以下を実行
                                        #echo "reboot"
                                        #rのbashを実行
                                        echo `bash "/opt/ethos/bin/r"`

                                fi
                        done

                        #echo "`head -n $tempcount $dir | tail -n 1`"
                done
                
                
                last=$current
                lastcount=`cat $dir | wc -l`
        fi
done

とりあえず、各変数を解説します。使う場合は、
INTERVAL
を好みの値に変更ができます。INTERVALとは、miner.outputのチェック間隔を指定する関数です。短くすると処理が早くなりますが、その分CPU使用率が高くなるため、Celeron G3930などを使用している場合は1~2秒が適当な値だと思います。


んで、このbashファイルと同一ディレクトリにlistというファイルを作成してください。そして、このファイルによく出るエラーを書き込んでください。基本的にはminer.outputを一行ずつ取得し、for文でこのlistと正規表現で部分一致しているかどうかをすべて確認する処理なので、例えばすべてのGPUに対応させたい場合などは、GPU0やGPU1などの通し番号は含まないように文字列を選択してください。
含んでしまうと、一致していないと認識し、reboot処理をしてくれません。
例えばZcashマイニングの場合、

"Looks like GPU0 are stuck he not respond."

というエラーをよく吐きますが、この場合はlistには

"are stuck he not respond."

と記載してください。GPU0までを含むとだめです。


基本的にはこれだけで処理をしてくれます。



ここからはソースコードの解説です。いろいろ書き換えたい人は参考にしてください。


まず、変数dirはshow minerを行った際参照されているminer.outputというファイルのディレクトリを指定しています。

dirlistは、rebootを行うきっかけとなるlistのディレクトリです。

まず、cat "dirlist"でlistから改行を境に配列化します。

update()は、sha256を用いてminer.outputがINTERVAL前と変更されているかを確認します。文字数がsha256を通すと一致するため、長時間運用をした際に一致しているかの確認に処理を食われないようにするためです。

変数lastは編集前のminer.outputを代入しています。lastcountはその行数です。

変数currentは、編集後のminer.outputを代入します。currentcountもその行数です。

temominerには、編集された部分のみを切り出しています。
countには編集された行数です。

編集された部分だけをlistとの一致不一致処理に入れることで、miner.outputの内容が膨大になっていった際の処理を軽くしています。



基本的には、その下にある二重のfor文で確認処理を行います。
初めのfor文でminer.outputを1行だけ抽出し、2つ目のfor文でその1行をlistと一致しているか確認します。


あとは、ソースコードのコメントを読めばわかるはずです。



なぜめんどくさいlistファイルを作ってまでこんな一般化したかというと、マイニングツールを変更してもlist内を編集したら対応できるようにするためです。

多分これで、zcashではなくethereumを掘っている人も使えるはずです。


あとは、起動時にこのbashファイルをバックグラウンドで常時監視できるようにするのですが、まず/ethos/home/custom.shを編集します。このファイルはethOS起動時に自動で実行されるbashファイルなので、こいつに監視してもらいます。

上のshellスクリプトを"autoreboot.sh"と書いた場合、

nohup bash "/home/ethos/autoreboot.sh" &


書き込んでください。
最後に"&"を付けるのを忘れないように。ブログの書き間違えではありません。&があることにより、バックグラウンド実行となります。また、普通にbashで実行すると、最後にあるexit 0によるshellスクリプト終了コマンドによってタスクがkillされてしまうので、nohupを使って実行します。

一応これで、起動時に自動でshellスクリプトを実行し、エラーを感知したら自動で再起動するようになりました。ただ、エラーを吐く前にフリーズをしたり、ネットワークが落ちて前兆もなく死ぬなどをされた場合にはこのスクリプトでは対処ができないため、そのあたりはまた別の手段を考えます。
多分マザーボードのPINに対してジャンパーを繋いで、pingで別PCから監視しながら、つながらなくなったら通電させるというのが一番早そうです。


一応動作確認はしていますが、何か予期せぬエラーがあったり、不明な点があったらコメントください。Twitter [@micomico_tisaki]に報告でも大丈夫です。


とりあえず今回はこの辺で。
このプログラムがどこかで誰かのマイニングrigを救ったらいいなと思いながら書いたので、是非使ってみてください。

ではまた


========追記です========

すみません、最初に書いた、loopbackについてですが、安定化しませんでした。未だにネットワークが他を巻き込んで落ちます。引き続き解決策を探していきます。