[server] Bash Loop-명령 내에서 Control-C를 누를 때 루프를 멈추는 방법은 무엇입니까?

몇 개의 디렉토리를 재 동기화하고 있습니다. bash 터미널이 열려 있고 다음과 같이 실행 중입니다.

for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done

그러나 모든 것을 멈추려면 Control-C를 누릅니다. 그러면 rsync가 중지되지만 다음 단계로 계속 진행됩니다. 이 경우, 나는 무슨 일이 있었는지 깨닫고 일이 다시 작동 할 때까지 미친 사람처럼 Control-C를 누르십시오.

이것을 ‘수정’할 방법이 있습니까? 그런 루프가 있고 Control-C를 누르면 내 bash 쉘로 돌아갑니다.



답변

for DIR in * ; do rsync -a $DIR example.com:somewhere/ || break; done

개별 rsync 실행이 어떤 이유로 실패하면 루프를 종료합니다.


답변

Dennis의 답변을 확장하기 위해 코드는 다음과 같습니다.

trap "echo Exited!; exit;" SIGINT SIGTERM

rsync와 관련된 실제 예제를 보려면 http://gist.github.com/279849를 확인하십시오 .


답변

Control-C에 대한 트랩을 설정할 수 있습니다.

trap <command> SIGINT

commandControl-C를 누르면를 실행합니다 . trap효과를 발휘할 지점에서 스크립트 어딘가에 문장을 넣으십시오 .


답변

괄호 안에 명령 문자열을 넣으면 문자열이 단일 프로세스로 작동하고 SIGINT를 수신하고 Ctrl– 를 누르면 종료됩니다 C.

(for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done)

그러나! rsync명령 의 경우 여러 소스를 허용하므로 작성한 코드는 다음과 같이 더 잘 작성됩니다.

rsync -a * example.com:somewhere/


답변

  1. Ctrl-Z스크립트를 일시 중단하려면 누르십시오 .
  2. kill %%

이 답변의 크레딧, 설명 및 자세한 내용 .


답변

루프에 쉽게 중단 될 수있는 다른 명령을 넣는 경향이 있습니다. 두 개의 Ctrl-C를 눌러야합니다.

for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; sleep 1 ; done

이 rsync에 대한 훌륭한 솔루션은 아니지만 아마도 빠르게 실행하고 싶을 것입니다. 그러나 다음과 같은 다른 루프에서는 잘 작동합니다.

while true ; do ping -c 10 example.com ; sleep 1 ; done

이 루프는 루프를 통해 매번 example.com의 주소를 다시 검색하므로 DNS 변경을보고있는 경우 유용합니다.


답변