![이 스크립트가 카운터 파일을 덮어쓰지 않는 이유는 무엇입니까?](https://linux55.com/image/13209/%EC%9D%B4%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EA%B0%80%20%EC%B9%B4%EC%9A%B4%ED%84%B0%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EB%8D%AE%EC%96%B4%EC%93%B0%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
스크립트가 서비스를 다시 시작하는 명령을 실행할 때 루프 카운터를 다시 시작하고 싶습니다. 어떤 이유로 스크립트를 완전히 종료하고 다시 시작할 때만 재설정됩니다.
### 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
이 작업을 수행 할 수 있습니다 .awk
awk '/lastBlockTime/ { print substr($2, 13, 8) }'
따옴표가 없는 변수를 많이 사용하고 있습니다. 해당 값에 공백이나 와일드카드 패턴 문자가 포함될 수 있는 경우 문제를 방지하려면 큰따옴표를 사용하는 것이 좋습니다.
끝에 있는 것은
exit 0
스크립트 끝의 오류를 마스크하므로 스크립트를 호출한 다음 올바르게 실행되었는지 감지할 수 없습니다.#!
스크립트를 실행하는 데 사용되는 인터프리터를 지정하는 줄이 스크립트에 누락되었습니다 .