잠긴 파일을 간단한 세마포어로 사용하여 이벤트를 직렬화 할 수 있습니다. 배치 파일의 stdout을 파일로 재지 정하면 해당 파일에 독점 쓰기 잠금이 설정됩니다. 다른 프로세스가 쓰기 액세스를 위해 동일한 파일을 열 수 없습니다. 프로세스가 끝나면 프로세스가 완료 될 때 잠금이 자동으로 해제됩니다 (종료, CTRL-C, 예외 오류 등)
배치 파일은 9를 잠금 파일로 리디렉션하려고 시도 할 수 있으며 실패하면 성공할 때까지 되돌아 간다. symstore 명령은 잠금이 작동하는 동안에 만 실행됩니다. 비표준 파일 핸들 (stream?)은 잠금이 stdin, stdout 또는 stderr 처리를 방해하지 않도록 사용됩니다.
따라서 symstore를 직접 호출하지 않아도됩니다. 대신 배치 스크립트를 통해 항상 호출합니다. 다음 (serializeSymstore.bat) 식으로 뭔가 :
@echo off
setlocal
:loop
:: Save stderr definition and redirect stderr to nul
:: to hide possible redirection error when establishing lock.
8>&2 2>nul (
%= Attempt to establish the lock and restore stderr =%
9>"\\centralServer\somePath\symstore.lock" 2>&8 (
%= If got here then lock is established throughout all commands =%
%= in this set of parentheses. =%
%= Execute your command =%
symstore %*
%= Save the return code =%
call set "rtnCd=%%errorlevel%%"
%= The next command is a very fast way to clear the ERRORLEVEL. =%
%= We don't want symstore failure to trigger a loop. =%
(call)
)
) || (
%= If entered here then failed to establish lock. =%
%= Wait 1 second and then loop back to retry. =%
%= Replace with PING delay if TIMEOUT not universally available. =%
timeout 1 /nobreak >nul
goto loop
)
:: Exit with appropriate return code
exit /b %rtnCd%
코멘트를하지 않고, 그것은 코드
@echo off
setlocal
:loop
8>&2 2>nul (
9>"\\centralServer\somePath\symstore.lock" 2>&8 (
symstore %*
call set "rtnCd=%%errorlevel%%"
(call)
)
) || (
timeout 1 /nobreak >nul
goto loop
)
exit /b %rtnCd%
의 작은 비트 나는이 원시적이고 단순한 전략은 많은 프로젝트에서 매우 효과적인 것으로 발견된다. 필자는 원격 시스템에서 잠금 및 릴리스 특성을 테스트하지 않았 음을 고백해야합니다. 그러나 모든 컴퓨터가 Windows 인 한 신뢰할 수 있어야한다고 생각합니다.
유일한 단점은 FIFO 대기열이 없다는 것입니다. 여러 개의 중복 요청이 수신되면 다음 단계로 넘어갈 무작위 추첨이됩니다. 그러나 프로세스가 직렬화됩니다.
편집 :
편집하기 전에 산산이 비트의 원본 답변을 읽었습니다. 그는 원격 컴퓨터에서 파일 잠금이 안정적인지 여부를 묻습니다. 몇 가지 빠른 Google 검색을했는데 UNC 경로에서 파일을 잠그는 데 문제가있는 것으로 보입니다. 문제가 발생하면 UNC 경로를 통해 직접 매핑 된 드라이브 문자 대신 파일로 리디렉션하는 것이 좋습니다. 이것은 모든 이론입니다. 나는 테스트를하지 않았습니다. 이 솔루션을 사용하기 전에 적절한 테스트를 수행하십시오. PUSHD는 사용 가능한 드라이브 문자를 몰라도 드라이브 문자를 UNC 경로에 임시로 할당하는 편리한 방법입니다. POPD는 드라이브 지정을 해제합니다.
다른 컴퓨터에서 동일한 컴퓨터에서'symstore'를 실행해야합니까? 또는 다른 컴퓨터에서'symstore'를 실행하여 중앙 컴퓨터에 심볼 저장소를 관리해야합니까? –
TFS 및 해당 빌드 프로세스 템플릿을 사용하여 심볼 저장소에 대한 액세스를 동기화 할 수 있습니다. 자세한 내용은 "SharedResourceScope 활동"을 참조하십시오. http://blogs.msdn.com/b/adamroot/archive/2009/06/17/source-server-and-symbol-server-features-in-team-foundation-server- 2010-beta-1.aspx –