원격 폴더를 동기화하기

  • Post Author:
  • Post Category:
  • Post Comments:0 Comments
  • Post last modified:February 8, 2020

백업 스크립트에 이은 MSBuild 예제를 보인다. 아래 코드는 robocopy를 이용해 원격 머신에 있는 공유 폴더의 내용을 로컬 컴퓨터에 동일하게 유지한다. 원격 폴더에 새 파일이 올라오면 로컬 폴더에 복사하고, 원격 폴더에서 예전 파일이 삭제되면 로컬 폴더에서도 삭제한다.

동기화 스크립트

<?xml version="1.0" encoding="UTF-8"?>
<Project 
	ToolsVersion="3.5" 
	InitialTargets=""
	DefaultTargets="Sync" 
	xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
>
	<!-- 작업 스케줄러가 실행하는 스크립트임 -->
	
	<!-- Special characters -->  
	<PropertyGroup>  
		<Semicolon>%3b</Semicolon>  
		 
		<Ampersand>&amp;</Ampersand>
		<LeftAngleBracket>&lt;</LeftAngleBracket>
		<RightAngleBracket>&gt;</RightAngleBracket>
		<StraightQuotationMark>&quot;</StraightQuotationMark>
		<Quot>$(StraightQuotationMark)</Quot>
		<Apostrophe>&apos;</Apostrophe>
	</PropertyGroup>  

	
	<Import Project="$(MSBuildProjectDirectory)\vendor\Earlgrey.BuildTools\MSBuildExtension\MSBuild.Earlgrey.Tasks.Targets"/>
	
	<ItemGroup>
		<SrcDir Include="\SrcMachine\SharedFolderA">
			<SrcUserName>me</SrcUserName>
			<SrcPassword>MyPassword</SrcPassword>
		
			<DstDir>f:\Shared Folders\NxK\TestClient</DstDir>
		</SrcDir>
		
		<SrcDir Include="\SrcMachine\SharedFolderB">
			<SrcUserName>me</SrcUserName>
			<SrcPassword>MyPassword</SrcPassword>
		
			<DstDir>f:\Shared Folders\NxA\TestClient</DstDir>
		</SrcDir>
	</ItemGroup>
	
	<Target Name="Sync">
		<Exec Command="NET USE $(QUOT)%(SrcDir.FullPath)$(QUOT) /DELETE" IgnoreExitCode="true" />
		
		<Exec
			Command="NET USE $(QUOT)%(SrcDir.FullPath)$(QUOT) $(QUOT)%(SrcPassword)$(QUOT) /USER:$(QUOT)%(SrcUserName)$(QUOT) /PERSISTENT:YES"
			/>

		<BetterRoboCopy
			SourceFolder="%(SrcDir.FullPath)" 
			DestinationFolder="%(DstDir)" 
			SourceFiles="*" 
			AllSubdirectories="true"
			ExcludeFolders=".svn;_svn"
			BackupMode="true"
			Mirror="true"
			CopyAll="true"
			Options="/R:3; /MON:1"
		/>

	</Target>
	
</Project>

MSBuild 스크립트에서는 동기화를 1회만 수행한다. MSBuild 스크립트의 실행이 끝나고 원격 폴더에 뭔가 바뀐다면 로컬 폴더에는 적용이 안 된다. robocopy에는 프로그램을 종료하지 않고 계속 떠서 원격 폴더의 변경 사항을 주기적으로 확인하는 기능이 있다. 하지만 위와 같이 두 개 이상의 폴더를 감시할 때는 써먹기 힘들다. 첫 번째 폴더를 감시하는 robocopy 프로세스가 종료되지 않는 이상 두 번째 폴더를 동기화할 프로세스를 시작시키지 못하기 때문이다.

작업 스케줄러

그래서 MSBuild 스크립트는 동기화를 1회 수행한 후 바로 종료된다. 대신 작업 스케줄러에서 이 스크립트를 1분마다 재실행해준다.

image

Robocopy 처럼 Win32 서비스가 아니고 UI가 있는 응용프로그램을 작업 스케줄러로 실행할 때는 시작 프로그램으로 등록해 놓고 정해 놓은 윈도우 계정이 자동 로그인해야 하는 줄 아는 사람이 많다. 하지만 도메인 정책으로 자동 로그인이 금지된 사내 환경에서는 이는 불가능할 뿐더러, UI가 있다고 해서 사용자 로그온이 반드시 필요한 것도 아니다. 아래와 같이 작업 스케줄러에 작업을 등록하면 UI가 있는 Robocopy 같은 프로세스도 윈도우가 부팅됨과 동시에 실행된다.

image

Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
follow me
  • RT @not_unot_u: 네 번째 올리신 청원글이에요. 너무 고생하고 계시는데 동의 한 번 씩 부탁드립니다. 거의 다 왔습니다! 7월 11일 마감인데 이제 2만명만 채우면 청와대 답변 받을 수 있어요. https://t.co/3mVDM3jsrP
    2 days ago
  • 그런데 전화를 받은 윤석열 검찰총장이 박 장관에게 ‘(조국 후보자가) 이제 그만 물러나라는 뜻으로 제가 (압수수색을) 지시했습니다’ 이렇게 말했다는 거지. 윤석열을 대통령으로 뽑은 기억은 없는데 희안하구만 https://t.co/yEEQXfey4g
    2 days ago
  • 훌륭한 시스템을 체험하지 못한 사람이 시스템의 부재로 야기되는 문제를 인식할 수 있을까? “난 잘하고 있는데 왜 너는 자꾸 불평하느냐?”라고 생각하지 않을까?
    3 days ago
Buy me a coffeeBuy me a coffee
×
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
Latest Posts