私はBSC(Binance Smart Chain)でブロックチェーンノードを実行していますが、ブロックが増えているかどうかを定期的に(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ループはどのようなものでしょうか?
私の考えは、このスクリプトをシステムサービスとして実行するか、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;}'