Bash 스크립트가 실행 중에 멈춤

Bash 스크립트가 실행 중에 멈춤

주소 , CSV주소 및 .source IPdestination IPdestination port

내 스크립트는 기본적으로 두 가지 테스트를 수행합니다.

1 성능 2 연결성.

성능 테스트에서 네트워크 IO를 계산하기 위해 source에서 destination(을 사용하여 ) 로 파일을 복사했습니다 . scp그런 다음 디스크 I/O를 고려하기 위해 동일한 파일이 대상 서버의 한 위치에서 대상 서버의 다른 위치로 복사됩니다.

연결 테스트에서 열려 있는지 확인 하기 nc위해 from을 수행하고 있습니다.sourcedestinationport

질문:때로는 스크립트를 실행하는 동안 어느 시점에서 멈춰서 Ctrl+C추가 실행을 계속하려면 프로세스 종료를 눌러야 합니다.

여기서는 왜 멈췄는지 알 수 없고, 스크립트의 다른 위치에 갇힐 때마다 동작조차 일관되지 않습니다.

이 문제를 해결하도록 도와주세요. 필요한 경우 여기에 전체 스크립트를 게시할 수 있습니다.

고쳐 쓰다:

관찰하다:제가 관찰한 또 다른 점은 Ctrl+C를 누르지 않으면 5분 후에 스크립트가 자동으로 다시 시작된다는 것입니다.

실제 스크립트의 일부가 붙어 있습니다.

#Connectivity Test
TMP=$(mktemp)
nc -z -v -n $lastDestinationIP $port >\$TMP
if grep -q "succeeded" <<< cat echo \$TMP;then
   echo $x','$lastSourceIP','$lastDestinationIP','$sourceFqdn','$fqdn','$port',Connectivity,NA,NA,NA,Pass,'$(date) | ssh $username@$baseLocation 'cat >> report.txt'
else
  echo $x','$lastSourceIP','$lastDestinationIP','$sourceFqdn','$fqdn','$port',Connectivity,NA,NA,NA,Fail,'$(date) | ssh $username@$baseLocation 'cat >> report.txt'
fi
rm $TMP
fi
exit
ENDSSH

대부분의 경우 종료를 호출하는 동안 중단됩니다.

이것은 대부분의 시간 동안 멈추는 코드 조각(콘솔의)입니다.

21 14:48:16 EDT 2014 | ssh [email protected] 'cat >> report.txt','Fri Mar
> fi
>
> #rm KB_33.txt
> #rm MB_10.txt
> #rm MB_100.txt
> rm -rf dummy
> else
> #Connectivity Test
> nc -z -v -n -w 2 10.X.X.17 1524 >/tmp/tmp.GJ1knZF5Jn
> if grep -q "succeeded" <<< cat echo /tmp/tmp.GJ1knZF5Jn;then
 21 14:48:16 EDT 2014 | ssh [email protected] 'cat >> report.txt','Fri Mar
> else
21 14:48:16 EDT 2014 | ssh [email protected] 'cat >> report.Fail,'Fri Mar
> fi
> fi
> exit
>

답변1

이것은짧고 달다-ㅏheredoc기본적으로 파일 설명자로 스트리밍되는 파일입니다.

대부분의 사람들은 그런 뜻이 아니다0<<descriptor그래서 당신은 할 수 있습니다<&0 stdin. ssh통과하다stdin호출된 프로세스에 연결되므로,heredoc호출하는 원격 셸에 입력을 전달합니다.

아주 특별한 품질heredocs차이점은 다음과 같습니다.\"'quoted그리고unquoted heredoc LIMITER.그래서,<<'THIS'와는 다르다<<THIS.인용하지 않을 때LIMITER,여기에서 문서의 내용을 평가하세요.${shell:+expansion}.한번에 한${shell:+expansion}일단 완성되면 이 문서를 다른 문서와 구별할 수 있는 것이 거의 없습니다.<~/input.

예를 들어:

cat <<\QUOTED >~/file
    $(echo "This is ${NOT:-} expanded.")
#END
QUOTED
cat <~/file
> $(echo "This is ${NOT:-} expanded.")
> #END

하지만...

cat <<UNQUOTED >~/file
    $(echo "This is ${NOT:-} expanded.")
#END
UNQUOTED
cat <~/file
> This is  expanded.
> #END

당신은 계속 사용bash <<< herestring그리고cat.정확히 어떻게 되는지는 모르겠지만herestring작동하지만 내기할 의향이 있어요cat's이미 참여했습니다. 그래서cat연결하다그것은<&0stdin그것으로stdout>&1.그게 전부입니다. 그래서 불필요하게 일을 복잡하게 만드네요<<STDIN때를<<< cat그것.

다음과 같은 경우에는 실제 문제가 될 수 있습니다.cat소비하고 싶지 않은 입력 스트림을 소비하게 됩니다. 그냥 실행% cat터미널에서는 아무 일도 일어나지 않은 것처럼 보일 것입니다. 왜냐하면 터미널의stdin그리고stdout같은 파일입니다 - 당신의$(tty).그러나 그들이 다를 때,cat맞잡다어쨌든, 그렇게 할 의도가 없다면 매우 혼란스러울 수 있습니다.

내가 보기엔 좀 닮은 것 같아\'quotes확장자를 건너뛰는 동안$(date)$expanded.그럼 그럴 수도 있지: null shell builtin호출되고|piped다음으로따옴표 없는 명령뒤쪽에ssh이것은 ~이 될 것이다cat >> report.fail이 파일에는 아무것도 생성되어서는 안 됩니다. 그래서cat>>appending /dev/null도착하다report.fail,그 정도는 견딜 수 있을 것 같아요. 아니면, 더 가능성이 높은 한,exit허용하다ssh대리인으로 활동null stream.

그리고 문자 그대로의 의미가 있는지 확인해보셨나요?$TMP현재 작업 디렉토리에 있나요? 난 봤어ENDSSH맨 밑에는 이렇게 생겼는데heredoc LIMITER내 생각에는 그것이 완전한 대본이 아니거나 잘못 편집된 것 같습니다. 사용되는 heredoc의 본문이라면 의미가 있을 것입니다.\$TMP,하지만 내 생각대로nc먼저 할 것이다>truncate그럼 그걸 써봐stdout명명된 사람에게$TMP.다시 말하지만, 아마도 당신은rm어쨌든, 아마도 당신은 눈치 채지 못했을 것입니다.

그리고 당신이니까rm영국$TMP누군가가 다음과 같은 질문을 한다는 사실을 깨닫지 못할 수도 있습니다.

어떻게$(mktemp)당신에게 도움이 됩니다. 필요하지 않습니다.filename.xxx토론?

고쳐 쓰다귀하의 결과를 주의 깊게 살펴보았는데 확실히 그렇습니다.>/tmp/tmp.GJ1knZF5Jn방법$(mktemp)일하는 - 심지어\$TMP부분. 그래서 당신은 내가 지정해야 한다고 말했어요mktemp .xxx파일 이름을 지정하는 경우. 감사해요.

아직도 꼭대기 어딘가에 이단자가 있는 것 같은데? 아마도 그렇지 않을 것이고\\단지 방법의 부작용을 해결하려고 노력 중입니다.echo \$TMP <<<herestring,하지만 모르겠어요...흥미롭네요.

이 변수들이 다 어디서 오는지 모르기 때문에 제 말이 완전히 맞는지는 모르겠습니다. 그러나 이것은 내가 할 일에 가깝습니다.

(실제로 마지막 두 질문은 관련이 없습니다)

_ssh() ( ssh "$1"@"$2" 'printf %s, `cat` >> '"$3"
) <<-PARAMS   
    "$lastSourceIP" 
    "$lastDestinationIP" 
    "$sourceFqdn" 
    "$fqdn" 
    "$port" "
    "ConnectivityNA" 
    "NA" 
    "NA" 
    "Pas" 
    "$(date)"
PARAMS

nc -z -v -n $lastDestinationIP $port |\
    grep -q "succeeded" && suffix=txt
_ssh user host report.${suffix:-fail}
unset suffix
?ENDSSH?

노트:이것"$quotes"위의 내용은printf's상대방의 이해관계ssh프로세스 - 다른 것은 없습니다. 그것들"quotes"위의 작업을 모두 수행한 후에도 동일하게 유지됩니다.PARAMS평가받다.

나는 이전에 거기에서 무슨 일이 일어나고 있는지 일부를 다루었습니다. 예를 들어func() ( scope )나는 그렇게 생각하고 싶다여기 덮어줘 알았어. 이것${parameter:-expansion}거기에도 포함되어 있지만 꽤 잘 표시되어 있습니다.여기그리고여기. 이상한 heredoc 문제가 있습니다.여기,여기, 그리고여기. 다른 사람도 있을 수 있습니다. 저는 껍질이나 물건을 만지작거리는 것을 좋아하는 것 같습니다.

하지만 이 경우에는 내가 가지고 있는 함수와 heredoc을 사용하여cat붙어있을 수 없습니다.PARAMS다음과 같이 전송됩니다stdin그리고cat도달하면 종료됩니다.EOF(또는 CTRL-D)그래서 한번 섭취하면PARAMS매번 멈출 것입니다. 이는 이 프로그램을 다음 환경에서 실행하는 경우 특히 중요합니다.heredoc이것은반품존재하다<&0왜냐하면PARAMS방해할 것이다cat실행 중에 스크립트를 먹습니다.

어쨌든, 이것이 도움이 되기를 바랍니다. 제가 놓친 부분이 있으면 언제든지 문의해 주세요.

관련 정보