IT教程 ·

【区块链】关于ETH/BTC区块的监控

linux入门系列14--ssh服务及主机远程管理

此次我写的是一个小型的shell, 链接钉钉的机器人, 运用过的应当会比较纯熟的了,下面就简述一下把

重要的功用就是, 当发明当地数据库区块跟收集上的区块差异相差较大的时刻就代表, 数据同步有问题, 这个时刻, 发出一条告警出来,

关于比特收集来讲,我用的是

注意到的哥们已发明了, 在首页的下方就是它的API, 我用的是比较愚昧的体式格局去挪用它, 直接用curl吧, 躁一把.

 


直接用curl了,取到信息了, 以下

 

然则有时刻运用curl会给我弹出total这些渣渣字段, 很不喜好, 所以, 发招用s参数吧, 以防万一

curl -s https://api.blockchair.com/ethereum/stats

取到的数据很明显了, 就是一个json花样的, 岂非我还要去弄一个东西去花样化它? 非也

在linux中, 想必人人都晓得,jq敕令就可以显现花样化json, 假如没有的话装置一下

yum  install jq -y

如许就好办很多了, 我们能够先把curl定义下来的东西重定向到一个文件中去啊, 然后用jq去剖析谁人文件不就行了吗, 接下来数据就变成如许了

[root@tx ~]# curl -s https://api.blockchair.com/ethereum/stats > block
[root@tx ~]# jq ".data.blocks" block 
9551780

你看, 直接取到收集上最新块的高度了, 然则, 为何会如许取呢, 实在用了jq以后花样是如许的了, 用过的应当就很清晰

 

看, 活生生就是一个json, 我用的是.data.blocks, 就是直接把高度过滤出来罢了.

那末接下来就是, 去取当地数据库中的高度了, 我这边用的是mysql, 直接就拿他开刀

[root@tx ~]# /data/tools/mysql -uroot -prkm2020 -S /tmp/mysql.sock -P 3306 -e "select cfg_val from db_config.tb_sysconfig where cfg_name='cache.usdt_erc20_sync_bcnum';"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------+
| cfg_val |
+---------+
| 9519439 |
+---------+
[root@tx ~]# 
[root@tx ~]#

看, 这就是我当地的高度, 然则, 假如你想拿这个9519439跟上面收集上取到的高度去对照, 那末就不得不去掉mysql查询花样出来的框框, 实在这里能够运用-N -s参数, 到底有什么用呢, 自行百度

[root@tx ~]# /data/tools/mysql -uroot -prkm2020 -S /tmp/mysql.sock -P 3306 -N -s -e "select cfg_val from db_config.tb_sysconfig where cfg_name='cache.usdt_erc20_sync_bcnum';"
mysql: [Warning] Using a password on the command line interface can be insecure.
9519439
[root@tx ~]# 
[root@tx ~]#

看, 直接抠出来了, 上面另有一个提示是吧, 实在不影响, 你直接把值取出来, 然后扔给一个变量去做对照, 是没问题的

那末直接就看shell吧

这是一个完全的shell !
解析器在写的时刻能够自行添加.

currencyType="ethereum"
MYSQL_CONN="/data/tools/mysql -uroot -prkm2020 -S /tmp/mysql.sock -P 3306 -N -s"
N=0

function dingding(){
    hostname=`hostname`
    webhook="https://oapi.dingtalk.com/robot/send?access_token=4db55f9cd1f96921acd6187d4431641e68bc39923d84d24fe0dbd"

    currTime1=`echo $(date +"%Y-%m-%d.%T")`
    curl ''$webhook'' 
   -H 'Content-Type: application/json' 
   -d '{"msgtype": "text", 
        "text": {
             "content": "
服务器:'$hostname' 发作: '$currencyType'区块数据同步非常!

[
提示主机:'$hostname'
提示信息: 区块数据同步非常
监控币种:'$currencyType'
进程同步区块:'$local_height'
收集最新区块:'$netwo_height'
区块差异:'$value'
提示时候:'$currTime1'
]
"
        }
      }'
}

function check(){
    local_height=`$MYSQL_CONN -e "select cfg_val from db_config.tb_sysconfig where cfg_name='cache.usdt_erc20_sync_bcnum';"`
    curl -s https://api.blockchair.com/${currencyType}/stats > /tmp/netwo_height
    netwo_height=`jq ".data.blocks" /tmp/netwo_height`
    value=$[netwo_height - local_height]
    echo $(date +"%Y-%m-%d.%T"),$value
    if [ $value -ge 6 ];then
        dingding
        N=$[N+1]
        sleep 600;
    else
        N=0
    fi
}
function main(){
    while :
    do
        sleep 180;
        if [ $N == 0 ];then
            check
        else
            if [ $N -ge 2 ];then
                sleep 300;
                check
            else
                sleep 50;
                check
            fi
        fi
    done
}
main

起首, 我把币种声明变量扔在了文件的开头位置, 下面就直接去辨认, 就是这个

currencyType="ethereum"

须要监控其他的能够换成其他的, 比方bitcoin等

然后我为了偷懒, 把mysql的衔接code, 塞进一个变量内里去, 为了下面轻易挪用它

dingding模块应当没什么好说的了, 搜检模块, 不过就是拿出数据库中的高度, 跟收集上重定向剖析出来的高度做对照, 用最新的高度减去当地区块, 得出差异, 我这边设置是在6个节点, 假如大于即是6, 那发个信息出来吧,

一定有人疑问, N是什么鬼, N就是一个统计告警数, 为了不让告警太频仍

比方我下面的main的主体挪用模块, 3分钟检测一下,假如N即是0, 那就是说, 统统一般,  那末假如说, 发明了一次告警, 那末N+1, 发了一次信息, 守候10分钟, 再检测, 假如10分钟后照样没有恢复, 还来告警, 那末N再+1, 那就是跑了下面的大于或即是2的时刻谁人前提了, 再守候5分钟然后再搜检, 假如说, 在这次死循环中, 告警事后恢复一般了, 然后N会被重置为0, 统统照样本来的样子容貌.

那末钉钉出来是怎样的呢, 如许的

目标是什么, 重要是为了让服务器当地环境与收集上的区块环境完成一致同步, 假如服务器的程序出现问题, 那末就可以第一时候晓得, 然后动手处置惩罚,
关于为何不必golang去写, 由于golang不会写, bash更简朴, 但最不圆满的就是, 大概死循环形成的资本斲丧远比golang小东西的多?
有待研讨。
就到这里。

 

在大学拼学业,搞副业,我也曾迷茫,但我一直在路上

参与评论