我有一个自动化的 jenkins 作业,它从 python 脚本中运行 msiexec.exe 安装。同一脚本的多个实例可以在同一台计算机上使用不同的参数启动。由于 msiexec.exe 一次只能处理 1 个安装,因此任何启动的并行安装都会引发错误并且 jenkins 作业挂起!
为了避免并行安装,我添加了一个 while 循环来检查是否有任何 msiexec 任务正在运行并等待它完成。但这仍然不是万无一失的,因为我看到了一些竞争条件问题。
需要序列化的步骤:
subprocess.check_call('msiexec /a 'install.msi')
虽然循环已经实现:
while "msiexec.exe" in os.popen('tasklist /FI "IMAGENAME eq msiexec.exe"').read().strip():
我相信创建进程锁将产生比检查 msiexec 任务是否已完成的 while 循环更好的结果。关于如何实现它的任何想法?请注意,它必须使用 python 2.7.3 的库存模块部分。安装新模块不是一种选择。
任务列表延迟 :有关 MSI 自定义操作如何在后台工作的详细信息 - msiexec.exe 将在 每个部署操作后的任务列表。
互斥锁
: msiexec.exe
在运行 MSI InstallExecuteSequence
时设置互斥锁(什么是互斥锁?(。这是为了允许在出现错误时回滚安装。因此,有必要防止来自其他MSI文件的更改 - 有点像在应用程序中处理多线程。你锁东西。
QueryServiceStatusEx :我的这个旧答案虽然混乱,但可能包含可以帮助您的链接: 其他安装 正在进行中 挂起我的 Wix 安装。
画家因素
:Chris Painter - MSI and .NET expert
- 这里有一个我从未尝试过的答案,但它看起来很棒:检查Windows安装程序互斥锁的可用性。
Github.com 掠夺? :我发现 github.com 有时会给予很多(多么有趣的词 - "糖果店里的孩子"( - 也许有一个快速的掠夺会议?快速采样。不确定这是否可以在VBScript或Python中完成,但我看到一些Powershell的东西。
友情链接 :
- 检查 Windows 安装程序互斥锁的可用性
- 以编程方式检测正在安装的 MSI 包