코드를 배포할 원격 서버가 있습니다. 현재 scp
업로드 코드를 사용하고 있지만 속도가 너무 느려서 (또는 더 효율적인 다른 코드로) scp
전환하고 싶습니다 . 연결을 rsync
설정하는 데 병목 현상이 발생하므로 ssh
서버에 대한 연결 수를 최소화하고 싶습니다.
로컬에서 내 빌드 프로세스는 및 하위 디렉터리를 out
포함하는 디렉터리를 출력합니다 . 출력 파일의 하위 집합을 원격 서버의 일치하는 위치에 푸시합니다.bin
lib
etc
내 scp
명령은 다음과 같습니다
scp out/bin/$BINFILES remote:/usr/bin
scp out/lib/$LIBFILES remote:/usr/lib
scp out/etc/$ETCFILES remote:/etc
이렇게 하면 원격 서버에 세 개의 연결이 설정되고 파일이 수정되지 않은 경우에도 파일 전체가 복사됩니다. 이것이 내가 한 일입니다 rsync
:
rsync -e ssh -avz out/bin/$BINFILES remote:/usr/bin
rsync -e ssh -avz out/lib/$LIBFILES remote:/usr/lib
rsync -e ssh -avz out/etc/$ETCFILES remote:/etc
더 빠르지만(압축 및 중복 제거) 여전히 원격 서버에 3개의 연결을 만듭니다.
rsync
단일 명령을 사용하여 이 세 개의 복사본을 얻을 수 있는 방법이 있습니까 ? 이것이 작동한다면 복사하기 전에 모든 {src,dest} 쌍을 임시 파일에 넣을 의향이 있습니다.
나는 또한 다른 도구를 사용해 보는 데 열려 있지만 OS X(현재 개발 플랫폼)에서 작동해야 하며 이상적으로는 전송 최적화를 지원해야 합니다 rsync
.
답변1
여러 개의 연속된 rsync 명령이 느린 이유는 SSH 연결을 설정하는 데 시간이 걸리기 때문입니다. 이 문제는 다음과 같이 해결할 수 있습니다.설정된 SSH 채널 사용.기본 연결 공유 설정그런 다음 기본 연결을 열고 rsync 명령을 변경하지 않고 사용하고(이 명령은 -e ssh
약 10년 동안 기본 명령이었습니다) 마지막으로 SSH 연결을 닫습니다.
ssh -Nf remote
rsync -avz out/bin/$BINFILES remote:/usr/bin
rsync -avz out/lib/$LIBFILES remote:/usr/lib
rsync -avz out/etc/$ETCFILES remote:/etc
ssh -O exit remote
SSH 연결 공유를 사용할 수 없는 경우(예: 한쪽에서 Dropbear 또는 매우 오래된 OpenSSH 버전을 실행 중이기 때문에) 다음을 수행할 수 있습니다.터널 구축, 그러나 이것이 더 문제가 됩니다.
또는 약간의 작업을 통해 다음을 사용하여 rsync 명령을 하나로 리팩터링할 수 있습니다.재동기화 필터그리고 심볼릭 링크. 이동 bin
하고 디렉터리를 지정할 수 있다면 lib
쉽습니다.
mkdir out/usr
mv out/bin out/lib out/usr/
rsync -avz \
--include='/bin/***' --include='/lib/***' --include='/etc/***' \
--exclude='*' out/ remote:/
이동할 수 없지만 복사하려는 트리에 절대 심볼릭 링크가 없는 경우 절대 심볼릭 링크를 사용하고 rsync에 이를 디렉터리로 처리하도록 지시할 수 있습니다.
ln -s "$PWD" out/usr
rsync -avz --copy-unsafe-links \
--include='/bin/***' --include='/lib/***' --include='/etc/***' \
--exclude='*' out/ remote:/