원격 폴더를 동기화하기

백업 스크립트에 이은 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

최 재훈

블로그, 페이스북, 트위터 고성능 서버 엔진, 데이터베이스, 지속적인 통합 등 다양한 주제에 관심이 많다.
Close Menu