Continue 문 이후 Bash 스크립트가 중단됨

Continue 문 이후 Bash 스크립트가 중단됨

여기에서는 여러 서버에 원격으로 SSH를 연결하고 이러한 서버에서 프로세스가 실행 중인지 확인하고 프로세스가 완료될 때까지 기다립니다.

while read ip name
do
  process=alive
  while [[ "$process" == "alive" ]]
  do
    process=dead
    (if [ 1 -eq "$(echo "$(ssh ubuntu@$ip "top -b -n2 -d 0.5|grep Cpu|awk '{print \$2+\$4}'|tail -n1") > 1" | bc)" ];then
      echo "Process is running on $ip"
      process=alive
      sleep 10
      continue 
    else
      echo "Process is not running on $ip"
      echo "I run some other commands here"
    fi) &
  done
done < ips
wait `jobs -p`

"continue" 문 다음에 코드가 깨졌습니다.

이것이 출력이다

+ read ip name
+ process=alive
+ [[ alive == \a\l\i\v\e ]]
+ process=dead
+ [[ dead == \a\l\i\v\e ]]
+ read ip name
+ process=alive
+ [[ alive == \a\l\i\v\e ]]
+ process=dead
+ [[ dead == \a\l\i\v\e ]]
+ read ip name
++ jobs -p
++ bc
+ wait 31090 31091
+++ ssh [email protected] 'top -b -n2 -d 0.5|grep Cpu|awk '\''{print $2+$4}'\''|tail -n1'
++ bc
+++ ssh [email protected] 'top -b -n2 -d 0.5|grep Cpu|awk '\''{print $2+$4}'\''|tail -n1'
++ echo '20.7 > 1'
+ '[' 1 -eq 1 ']'
+ echo 'Process is running on 249.X.X.X'
Process is running on 249.X.X.X
+ process=alive
+ sleep 10
++ echo '14.6 > 1'
+ '[' 1 -eq 1 ']'
+ echo 'Process is running on 256.X.X.X'
Process is running on 256.X.X.X
+ process=alive
+ sleep 10
+ continue
+ continue

답변1

stdin(파일 ips) 읽기 중지 ssh로 대체되었습니다 .ssh -n


바라보다:man ssh

답변2

그러나 표준 입력으로의 ssh -n리디렉션을 사용하면 즉각적인 문제가 해결됩니다. 그렇지 않은 경우 파일 에서 읽혀집니다 . 하지만 코드에서 다른 불필요한 작업을 수행하고 있습니다./dev/nullssh-nsships

수정된 코드:

while read ip name; do
    (
    while true; do
        if ssh -n "ubuntu@$ip" top -b -n2 -d 0.5 | awk '/Cpu/ && n++ { exit($2+$4 > 1) }'
            printf 'Process is running on %s\n' "$ip"
            sleep 10
        else
            printf 'Process is not running on %s\n' "$ip"
            echo 'I run some other commands here'
            break
       fi
    done
    ) &
done <ips

wait

코드를 단순화했습니다

  • top원격 호스트에서 더 이상 아무것도 실행하지 않고
  • awk와 함께 종료 값을 직접 사용하십시오 if.
  • break(현재) 무한 루프를 깨기 위해
  • 명령문뿐만 아니라 백그라운드 작업에서 루프를 실행 if하고
  • wait모든 백그라운드 프로세스를 기다리려면 인수 없이 사용하세요 .

if이 문이 전혀 필요하지 않은 또 다른 변형은 다음과 같습니다.

while read ip name; do
    (
    while ssh -n "ubuntu@$ip" top -b -n2 -d 0.5 | awk '/Cpu/ && n++ { exit($2+$4 > 1) }'
    do
        printf 'Process is running on %s\n' "$ip"
        sleep 10
    done
    printf 'Process is not running on %s\n' "$ip"
    echo 'I run some other commands here'
    ) &
done <ips

wait

관련 정보