Скрипт-обвязка для stratum-прокси Dwarfpool
Обвязка вокруг 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}")"
cd "${dpath}"
python "${fpath}" 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 '$1'")
}
{
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
}'