gpt4 book ai didi

windows - 通过 Powershell 或 BATCH 序列化执行 symstore

转载 作者:可可西里 更新时间:2023-11-01 09:20:45 24 4
gpt4 key购买 nike

我们正在努力将一个步骤集成到我们的持续集成 (CI) 服务器 (CruiseControl.NET) 中。我们希望将构建过程中生成的调试符号 *.pdb 注册到 Microsoft 符号服务器中。正如 Microsoft 所实现的那样,符号服务器是 Visual Studio 用于查找 C++/C# 可执行文件的 *.pdb 调试符号的目录结构。 Microsoft 提供了一个命令 symstore,它在一个目录中获取调试符号,并根据需要填充中央符号存储目录。

问题是 symstore 明确指出并发运行是不安全的。

我们可以尝试哪些方法或策略来禁止通过 BATCH 或 Powershell 脚本并发执行 symstore 命令?

我们的方法很灵活,但因为我们在 Windows 平台上运行,所以 BATCH 和 Powershell 是首选解决方案。

澄清:

对于我们的用例,symstore 需要可从两个不同的 CI 服务器运行,这会将符号保存在一个公共(public)网络驱动器上。

资源:

符号库:: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681417(v=vs.85).aspx

最佳答案

您可以将锁定的文件用作简单的信号量来序列化事件。当您将 stdout 重定向到批处理文件中的文件时,它会在该文件上建立独占写锁定。没有其他进程可以打开同一文件进行写访问。当进程结束时,锁会自动释放,不管它是如何结束的(干净退出、CTRL-C、异常失败等)

批处理文件可以尝试将 9 重定向到锁定文件,如果失败,则循环返回直到成功。 symstore 命令仅在锁定就位时运行。使用非标准文件句柄(流?),以便锁定不会干扰标准输入、标准输出或标准错误处理。

所以你只需要确保你永远不会直接调用 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 队列。如果收到多个重叠的请求,那么接下来要进行哪个进程就完全靠运气了。但是流程将被序列化。

编辑:
在编辑之前,我已经阅读了 splattered bits 的原始答案。他质疑文件锁定在远程机器上是否可靠。我快速进行了一些 Google 搜索,发现 UNC 路径上的文件锁定确实存在一些问题。如果遇到问题,重定向到映射驱动器号上的文件而不是直接通过 UNC 路径可能会更好。这都是理论——我没有做过任何测试。在采用此解决方案之前,请务必进行充分的测试。请注意,PUSHD 是一种在不知道可用的驱动器号的情况下临时将驱动器号分配给 UNC 路径的便捷方法。 POPD 将取消映射驱动器分配。

关于windows - 通过 Powershell 或 BATCH 序列化执行 symstore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18002294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com