Скрипт-обвязка для stratum-прокси Dwarfpool — различия между версиями

Материал из Linux Wiki
Перейти к: навигация, поиск
(Новая страница: «Обвязка вокруг [https://github.com/Atrides/eth-proxy stratum-прокси], изначально созданная для перезапуска п…»)
 
м
 
Строка 18: Строка 18:
 
fpath="$(readlink -f "${1}")"
 
fpath="$(readlink -f "${1}")"
 
dpath="$(dirname "${fpath}")"
 
dpath="$(dirname "${fpath}")"
 +
efile="$(basename "${fpath}")"
  
 
cd "${dpath}"
 
cd "${dpath}"
  
python "${fpath}" 2>&1 | awk '
+
python "${efile}" 2>&1 | awk '
  
 
         BEGIN {
 
         BEGIN {
Строка 54: Строка 55:
 
                 for (i in arr) sum+=arr[i]
 
                 for (i in arr) sum+=arr[i]
 
                 if (arr[13]=="") col="\033[33m"
 
                 if (arr[13]=="") col="\033[33m"
                         else if (sum*100/length(arr)>'30') system("pkill -f '$1'")
+
                         else if (sum*100/length(arr)>'30') system("pkill -f '$efile'")
 
         }
 
         }
  

Текущая версия на 19:40, 13 марта 2016

Обвязка вокруг stratum-прокси, изначально созданная для перезапуска прокси в случае обрывов соединения с интернетом. У прокси (тестировалось на v 0.0.4) был баг - при обрыве внешнего канала прокси об этом не знал и продолжал принимать шары от ригов и пытаться отправлять их на пул. Пул про это соединение ничего не знал и вся работа reject'илась. На основе этого и было решено сделать перезапуск. Первая версия скрипта имеет такую структуру. По факту накопления сообщений с reject'ами убивался процесс прокси, а внешний скрипт (бесконечный цикл со sleep'ом) делал новый запуск.

В дальнейшем функционал скрипта был расширен. Теперь, помимо основной функции, он строит статистику по принятой и отброшенной работе в целом, а также по воркерам в отдельности. Статистика по работе дополняет поток сообщений прокси колонкой слева. Статистика по воркерам выводится в потоке раз в 100 секунд.

Было также добавлено цветовое выделение шар. Сообщения с принятыми шарами выделяются зеленым, с отброшенными шарами - красным. При запуске прокси, для исключения ложных срабатываний (когда, например, одна из первых полученных шар отбрасывается, что дает высокий процент reject'ов по отношению к общей работе), сделано окно в 14 сообщений, в течение которого будет игнорироваться высокий процент reject'ов. Такие сообщения выделяются желтым.

Как и раньше, скрипт необходимо запускать в бесконечном цикле для перезапуска прокси.

while sleep 3 ; do /path/to/script /path/to/eth-proxy.py ; done

#!/bin/bash
 
[ -z "${1}" ] && exit 1
 
fpath="$(readlink -f "${1}")"
dpath="$(dirname "${fpath}")"
efile="$(basename "${fpath}")"
 
cd "${dpath}"
 
python "${efile}" 2>&1 | awk '
 
        BEGIN {
                sum=0
                w=0
                rej=0
                oldtime=0
        }
 
        {
                col="\033[0;0m"
        }
 
        /eth_submitWork/&&/protocol/{
                nl+=1
                w+=1
                sum=0
                wname=$9
                gsub(/'\''/, "", wname)
                if (nl>15) nl=0
                if ($0 ~ /REJECT/) {
                        rstat[wname]+=1
                        arr[nl]=1
                        rej+=1
                        col="\033[31m"
                } else {
                        astat[wname]+=1
                        arr[nl]=0
                        col="\033[32m"
                }
 
                for (i in arr) sum+=arr[i]
                if (arr[13]=="") col="\033[33m"
                        else if (sum*100/length(arr)>'30') system("pkill -f '$efile'")
        }
 
        {
                CONVFMT="%.2f"
                if (w=="0") st="na"
                        else {
                        st=rej*100/w
                        if (systime()-oldtime > 100) {
                                oldtime=systime()
                                print " ** Workers statistic ** "
                                for (s in astat)
                                        printf "%-24s %-15s %-8s %-8s %-6s\n", " ", "| "s":", "A:"astat[s], "R:"rstat[s]*100/(astat[s]+rstat[s])"%", "P:"(astat[s]+rstat[s])*100/w"%"
                        }
                }
                printf "%-8s %-8s %-6s | %s\033[0;0m\n", "A:"w, "R:" st "%", "WD:" sum, col $0
 
        }'