このスクリプトがカウンタファイルを上書きしないのはなぜですか?

このスクリプトがカウンタファイルを上書きしないのはなぜですか?

スクリプトがサービスを再起動するコマンドを実行すると、ループカウンタを再起動したいと思います。何らかの理由でスクリプトを完全に終了して再起動した場合にのみリセットされます。

### CONFIGURATION
# path to jcli
JCLI="jcli"
JCLI_PORT=3100

LAST_BLOCK=""

START_TIME=$SECONDS

# this sets the counter file and it does indeed write it back to 0 when the script is started and stopped. 

TEMPFILE=/tmp/counter.tmp
echo 0 > $TEMPFILE

# block log file
BLOCK_LOG=/home/coconut/logs/block.log

# how many seconds should we wait if no blocks show up
RESTART_GT=240

# display output headers
echo "/////////////////////////////////////////////////////////////////////////////////////"
echo "///////////////////////// JORMUNGANDR NODE MONITOR //////////////////////////////////"
echo "/////////////////////////////////////////////////////////////////////////////////////"
echo ""
echo "TODAY DATE | EP | SLOT# | EXP TIME | LOC TIME | HEIGHT | LAST HASH | COUNTER"
echo ""

echo "/////////////////////////////////////////////////////////////////////////////////////" >> ${BLOCK_LOG}
echo "///////////////////////// JORMUNGANDR NODE MONITOR //////////////////////////////////" >> ${BLOCK_LOG}
echo "/////////////////////////////////////////////////////////////////////////////////////" >> ${BLOCK_LOG}
echo ""  >> ${BLOCK_LOG}
echo "TODAY DATE | EP | SLOT# | EXP TIME | LOC TIME | HEIGHT | LAST HASH | COUNTER" >> ${BLOCK_LOG}
echo ""  >> ${BLOCK_LOG}


while true
do
    DATE=$(date '+%Y-%m-%d')
    TIME=$(date '+%H:%M:%S')
    LAST_HASH=$($JCLI rest v0 node stats get --host "http://127.0.0.1:${JCLI_PORT}/api" | grep lastBlockHash | awk '{print $2}' | cut -c 1-10)
    LATEST_BLOCK=$($JCLI rest v0 node stats get --host "http://127.0.0.1:${JCLI_PORT}/api" | grep lastBlockHeight | awk '{print $2}' | rev | cut -c 2- | rev | cut -c 2-)
    LATEST_SLOT=$($JCLI rest v0 node stats get --host "http://127.0.0.1:${JCLI_PORT}/api" | grep lastBlockDate | awk '{print $2}' | rev | cut -c 2- | rev | cut -c 5- )
    LAST_BLOCK_TIME=$($JCLI rest v0 node stats get --host "http://127.0.0.1:${JCLI_PORT}/api" | grep lastBlockTime | awk '{print $2}' | cut -c 13- | rev | cut -c 8- | rev)
    EPOCH=$($JCLI rest v0 node stats get --host "http://127.0.0.1:${JCLI_PORT}/api" | grep lastBlockDate | awk '{print $2}' | cut -c -3 | cut -c 2- )
    if [ "$LATEST_BLOCK" > 0 ]; then
        if [ "$LATEST_BLOCK" != "$LAST_BLOCK" ]; then
            COUNTER=$((COUNTER+1))
            START_TIME=$(($SECONDS))
            echo "${DATE} | ${EPOCH} | ${LATEST_SLOT} | ${LAST_BLOCK_TIME} | ${TIME} | 0${LATEST_BLOCK} | ${LAST_HASH} | ${COUNTER}"
            echo "${DATE} | ${EPOCH} | ${LATEST_SLOT} | ${LAST_BLOCK_TIME} | ${TIME} | 0${LATEST_BLOCK} | ${LAST_HASH} | ${COUNTER}" >>  ${BLOCK_LOG}
            LAST_BLOCK="$LATEST_BLOCK"
        else
            ELAPSED_TIME=$(($SECONDS - $START_TIME))
            if [ "$ELAPSED_TIME" -gt "$RESTART_GT" ]; then
                echo "//////////////////////////////////////////////////////////////////////////////////"
                echo "${DATE} | ${TIME} | Restarting Jormungandr. | Waited ${ELAPSED_TIME} for block."

                echo "//////////////////////////////////////////////////////////////////////////////////" >>  ${BLOCK_LOG}
                echo "${DATE} | ${TIME} | Restarting Jormungandr. | Waited ${ELAPSED_TIME} for block." >>  ${BLOCK_LOG}

                sudo service jorg restart
                LAST_BLOCK="$LATEST_BLOCK"
                echo "Sleeping for 90 sec."
                sleep 90


                ## this is where it should reset the counter to 0 since the script is being restarted
                echo 0 >! ${TEMPFILE}


            fi
        fi
    else
        echo "No block height"
        # Reset time
        START_TIME=$(($SECONDS))
    fi
    sleep 20
done

exit 0

答え1

注文する

echo 0 >! ${TEMPFILE}

そして変数の内容を名前付きファイル0に書き込みます。それは等しいTEMPFILE!

echo 0 ${TEMPFILE} > "!"

私の考えであなたがしたいことは

echo 0 > "$TEMPFILE"

または多分

echo 0 >| "$TEMPFILE"

これにより、名前付きファイルが切り捨てられ、$TEMPFILEその後0に改行文字が続きます。

このファイルに0万書き込みするので、このファイルで何をしているのかよくわかりません。しかし、上記の行はスクリプトでコメントされた行であり、リダイレクトに問題があります。


その他のランダムコメント:

  • 何度も呼び出します$JCLI rest v0 node stats get --host "http://127.0.0.1:${JCLI_PORT}/api"。時間がかかる場合やリソースを使用している場合は、一度だけ実行し、結果を後で複数回解析されるファイルに保存することをお勧めします。

  • パイプラインがgrep lastBlockTime | awk '{print $2}' | cut -c 13- | rev | cut -c 8- | rev過度に複雑に見えます。たとえば、次のような単一の呼び出しを使用してsedこれを実行できます。awkawk '/lastBlockTime/ { print substr($2, 13, 8) }'

  • 引用符のない変数を多く使用しています。その値にスペースまたはワイルドカードパターン文字を含めることができる場合は、問題を回避するために二重引用符を使用することをお勧めします。

  • 最後にあるのはexit 0スクリプトの最後のエラーをマスクするため、スクリプトを呼び出して正しく実行されたかどうかを検出できません。

  • #!スクリプトの実行に使用されるインタプリタを指定する行がスクリプトにありません。

関連情報