[英]How do I serialize msiexec.exe installation using multiprocessing or any other module via python scripting?
我有一個自動 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 的庫存模塊部分。 安裝新模塊不是一種選擇。
任務列表延遲:有關 MSI 自定義操作如何在幕后工作的更多信息 - 在每次部署操作后, msiexec.exe 將在任務列表中保留 10 分鍾。
互斥體: msiexec.exe
在運行 MSI 的InstallExecuteSequence
設置互斥體( 什么是互斥體? )。 這是為了允許在出現錯誤時回滾安裝。 因此,有必要防止其他 MSI 文件的更改 - 有點像處理應用程序中的多線程。 你鎖東西。
QueryServiceStatusEx :我的這個舊答案雖然凌亂,但可能包含可以幫助您的鏈接: 其他安裝正在進行中掛我的 Wix 安裝。
Painter-Factor : Chris Painter - MSI and .NET expert
- 在這里有一個我從未嘗試過的答案,但它看起來很棒: 檢查 Windows 安裝程序互斥鎖的可用性。
Github.com 掠奪? :我發現github.com 有時會提供很多信息(多么有趣的詞 - “糖果店里的孩子”) - 也許有一個快速的掠奪會議? 快速樣品。 不確定這是否可以在 VBScript 或 Python 中完成,但我看到了一些 Powershell 的東西。
鏈接:
想到的一個想法:為 msiexec.exe 編寫一個自定義包裝器,它使用命名互斥鎖進行阻塞,直到包裝器的前一個實例完成
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.