【问题标题】:How do I serialize msiexec.exe installation using multiprocessing or any other module via python scripting?如何通过 python 脚本使用多处理或任何其他模块序列化 msiexec.exe 安装?
【发布时间】:2019-12-12 16:33:41
【问题描述】:

我有一个自动化的 jenkins 作业,它从 python 脚本运行 msiexec.exe 安装。可以在同一台机器上使用不同的参数启动同一脚本的多个实例。由于 msiexec.exe 一次只能处理 1 个安装,因此任何启动的并行安装都会引发错误并且 jenkins 作业挂起!

为了避免并行安装,我添加了一个 while 循环来检查是否有任何 msiexec 任务正在运行并等待它完成。但这仍然不是万无一失的,因为我看到了一些竞争条件问题。

需要序列化的步骤:

subprocess.check_call('msiexec /a 'install.msi')

while 循环已经实现:

while "msiexec.exe" in os.popen('tasklist /FI "IMAGENAME eq msiexec.exe"').read().strip():

我相信在检查 msiexec 任务是否已完成时,创建进程锁会比 while 循环产生更好的结果。关于如何实现它的任何想法?请注意,它必须使用 python 2.7.3 的库存模块部分。安装新模块不是一种选择。

【问题讨论】:

标签: python windows serialization multiprocessing windows-installer


【解决方案1】:

任务列表延迟:更多关于 MSI 自定义操作如何在幕后工作的信息 - msiexec.exe will remain for 10 minutes in the task list 在每次部署操作之后。


Mutexmsiexec.exe sets a mutex 同时运行 MSI 的 InstallExecuteSequence (What is a mutex?) .这是为了在出现错误时允许回滚安装。因此有必要防止来自其他 MSI 文件的更改 - 有点像在应用程序中处理多线程。你锁东西。

QueryServiceStatusEx:我的这个旧答案虽然杂乱无章,但可能包含可以帮助您的链接:Other installation In Progress Hanging my Wix Install

画家因素Chris Painter - MSI and .NET expert - 这里有一个我从未尝试过的答案,但看起来太棒了:check for windows installer mutex availability.

Github.com Pillage?:我发现 github.com 有时会提供很多东西(多么有趣的词——“糖果店里的孩子”)——也许有一个快速掠夺会议? Quick sample。不确定这是否可以在 VBScript 或 Python 中完成,但我看到了一些 Powershell 的东西。


链接

【讨论】:

    【解决方案2】:

    想到的一个想法:为 msiexec.exe 编写一个自定义包装器,它使用一个命名的互斥锁来阻塞,直到包装器的前一个实例完成

    【讨论】:

    • 感谢您的建议,我确实想出了以下粗略的方法来处理它,但这意味着我需要安装 python win32 :( import subprocess import win32event, win32api name = "MSIInstallLockInstance" handle = win32event.CreateMutex(None, 0, name) print "Checking if MSI Installer Lock is available..." win32event.WaitForSingleObject(handle, win32event.INFINITE) print "Lock Acquired" subprocess.check_call('msiexec.exe /a install.exe') win32event.ReleaseMutex(handle) win32api.CloseHandle(handle) print "Lock Released"
    • 这就是我的想法。如果尚未安装,我会使用 C++ 来消除 python 要求
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2020-01-08
    相关资源
    最近更新 更多