我从 BSC(币安智能链)运行一个区块链节点,我想实现一个脚本,定期(30 秒)检查块是否在增加,如果没有增加,则会重新启动 systemd 服务。
这就是我开始的:
#!/bin/bash
bsc_height=$(curl http://localhost:8545 -X POST -H "Content-Type: application/json" -d '{ "jsonrpc": "2.0","id": 0,"method": "eth_blockNumber"}' | awk -F ":" '{ print $4}' | sed 's|["{},]||g')
bsc_height_decimal=$(echo $((bsc_height)))
这样我就可以通过变量获取当前块的高位bsc_height_decimal
,假设它的值是当前13083806
。systemctl restart bsc
如果计数在这段时间内没有增加,每 30 秒检查一次并执行的 bash 循环会是什么样子?
我的想法是然后将此脚本作为 systemd 服务运行,或者可能是 crontab?我正在尝试找出最好的方法,你们觉得呢?
答案1
#!/bin/bash
declare -r WAIT_SEC='30'
bsc_height_decimal=
bsc_height_decimal_old=
while true; do
bsc_height=$(curl http://localhost:8545 -X POST -H "Content-Type: application/json" -d '{ "jsonrpc": "2.0","id": 0,"method": "eth_blockNumber"}' | awk -F ":" '{ print $4}' | sed 's|["{},]||g')
bsc_height_decimal=$(echo $((bsc_height)))
if [ -n "$bsc_height_decimal_old" ] && [ "$bsc_height_decimal_old" -eq "$bsc_height_decimal" ]; then
systemctl restart bsc
fi
bsc_height_decimal_old="$bsc_height_decimal"
sleep "$WAIT_SEC"
done
和
awk -F ":" '{ print $4}' | sed 's|["{},]||g'
可以替换为
awk -F ":" '{ output=$4; gsub("[\"{},]","",output); print output;}'