【区块链】关于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小东西的多?
有待研讨。
就到这里。
在大学拼学业,搞副业,我也曾迷茫,但我一直在路上