시스템 다운타임이 임계값을 초과할 때 시스템 서비스를 시작하는 간단한 스크립트를 bash에 만들었습니다.만약에부분은 기본적으로 정수값(명령어에서 추출)을 확인합니다.임계점값(정수)
통제는 하지 않을 것이다만약에성명. 누구든지 나에게 위의 솔루션을 제안할 수 있습니까? IF 문에서 정수 표현식을 테스트하는 방법
#!/bin/bash
**function start_repair {
threshold=120
IP=10.194.51.216
echo "$((systemctl status cassandra | awk'/(Active:failed)/{print$10}')| awk '{print ($0+0)}')"
if [[ "$((systemctl status cassandra | awk '/(Active: failed)/{print $10}') | awk '{print ($0+0)}')" -gt "${threshold}" ]]; then
echo "greater than ${threshold}"
service cassandra restart
PID=$!
wait $PID
echo done
fi }**
실수: bash: 5행: [: : 정수 표현식 필요
답변1
귀하의 질문과 귀하의 기능에 몇 가지 문제가 있습니다.
첫째, [: : integer expression expected
오류귀하의 기능에 의해 생성되지 않습니다. 함수 내의 테스트에서는 [[ ... -gt ... ]]
이 오류가 발생하지 않습니다(테스트를 위해 명령줄에서 사용 [[ "hello" -gt "world" ]]
). 이 오류를 생성하는 단일 괄호를 사용하는 다른 테스트가 어딘가에 있습니다(명령줄에서 사용하여 테스트 [ "hello" -gt "world" ]
). [ ... ]
코드의 다른 곳에서 산술 테스트를 찾아보세요.
bash
오류 메시지 자체에서 이 [
유틸리티가 오류를 생성했으며 산술 테스트를 수행하려고 했던 대상이 빈 문자열이었다는 것을 알려주므로 이를 확인할 수 있습니다 .
print (0+$0)
댓글에서 코드가 작동하도록 변경했다고 말씀하셨습니다 . 진술이 동일하기 때문에 이 변경 사항이 어떤 영향을 미칠지 의심됩니다. 아마도 스크립트에 대한 입력이 변경되어 오류가 발생하지 않았을 가능성이 높습니다.print 0+$0
awk
그런 다음 in test 로 변경했다고 댓글을 달았습니다 -gt
. >
이는 테스트를 사전식 문자열 정렬 테스트로 변경합니다. 그러한 테스트는진짜예를 들어 왼쪽 문자열이 오른쪽 문자열 뒤에 오면 다음 20 > 100
과 같습니다 .진짜.
이는 또한 오류가 실제로 표시되는 함수에 있지 않다는 점을 무시합니다.
내 조언은 스크립트를 작성하고 스크립트를 작성할 때 스크립트의 각 구성 요소를 테스트하여 스크립트의 각 추가 사항이 원하는 작업을 수행하는지 확인하라는 것입니다.
기능 자체로는 문제가 많습니다.
예를 들어 변수는 프로세스의 프로세스 ID를 PID
보유해야 하지만 이를 백그라운드 작업( 명령 끝에 사용됨) 으로 실행하지 않기 때문에 예상한 것과는 다릅니다. , 그리고 후속 프로세스는 여러분이 기다리고 있다고 생각하는 프로세스를 기다리지 않습니다.cassandra
cassandra
&
PID
wait $PID
PID
변수와 호출을 통해 wait
달성하려는 것이 명확하지 않습니다 . 내 생각에는 쌍의 할당 PID
과 쌍의 호출을 제거할 수 있다는 것입니다 wait
.
$(( ... ) | ... )
로 작성하는 것이 더 좋습니다 $( ... | ... )
. 첫째, systemctl | awk
서브셸에서 실행하는 것은 불필요하고 둘째, 읽기가 혼란스럽습니다 $(( ... ))
.산수평가하다.
암호
awk'/(Active:failed)/ {print $10}' | awk '{print ($0+0)}'
으로 병합될 수 있습니다.
awk'/(Active:failed)/ { print 0+$10 }'