2012-02-03 139 views
0

我有8個PowerShell腳本。很少有人有依賴性。這意味着它們不能並行執行。他們應該被陸續執行。並行化powershell腳本執行

一些Powershell腳本沒有依賴性,可以並行執行。

以下是依賴詳細

Powershell scripts 1, 2, and 3 depend on nothing else 
    Powershell script 4 depends on Powershell script 1 
    Powershell script 5 depends on Powershell scripts 1, 2, and 3 
    Powershell script 6 depends on Powershell scripts 3 and 4 
    Powershell script 7 depends on Powershell scripts 5 and 6 
    Powershell script 8 depends on Powershell script 5 

我知道,通過手動硬編碼的依賴性,可以解釋的。但是可能會添加10個更多的PowerShell腳本,並且可能會添加它們之間的依賴關係。

有沒有找到依賴關係的並行?如果是這樣,請與我分享如何繼續。

回答

1

你對一般的並行編程有多熟悉?您是否聽說過使用mutual exclusion的概念?通常的概念是使用某種消息/鎖定機制來保護不同並行線程之間的共享資源。

就你而言,你將分隔線本身作爲腳本 - 我認爲這可能比這篇維基百科文章中概述的大多數技術簡單得多。這個簡單的模板是否適用於您要查找的內容?

  1. 在本地文件系統中定義一個文件夾。這個位置將被所有腳本知道(默認參數)。
  2. 在運行任何腳本之前,請確保刪除該目錄中的任何文件。
  3. 對於每個腳本,作爲它們執行的最後一步,他們應該在共享目錄中使用它們的腳本名稱作爲文件的名稱編寫一個文件。因此,script1.ps1會創建script1文件。
  4. 對另一個腳本有依賴性的任何腳本都將根據腳本的文件名來定義這些依賴性。如果script3依賴於script1和script2,則將在script3中將其定義爲依賴項參數。
  5. 所有具有依賴性的腳本都將運行一個函數,該函數檢查文件是否存在於它所依賴的腳本中。如果是,則繼續執行腳本,否則會暫停,直到完成爲止。
  6. 所有腳本通過主腳本/批處理文件同時啓動。所有腳本都作爲PowerShell作業運行,以便操作系統將並行運行它們的執行。大多數腳本會啓動,看到它們有依賴關係,然後耐心等待這些問題得到解決,然後再繼續執行腳本主體。

好消息是,這將允許靈活地改變依賴關係。每個腳本都會寫一個文件,不要假設別人是否在等待它。改變特定腳本的依賴關係將是一個簡單的單行更改或輸入參數的更改。

雖然這絕對不是一個完美的解決方案。例如,如果一個腳本失敗會發生什麼(或者你的腳本可以在多個不同的代碼路徑中退出,但你忘記在其中的一箇中寫入文件)?這可能會導致死鎖情況,其中不會有依賴腳本被啓動。另一件壞事是在等待正確的文件被創建時忙着等待睡眠或旋轉 - 這可以通過執行Event-based方法來糾正,您可以通過該方法讓操作系統監視目錄以進行更改。

希望這有助於並不是所有的垃圾。

+0

這不僅僅是一個答案,你讓我思考並行性太嚴重。感謝您的傑出答案。 – Samselvaprabu 2012-02-04 03:18:40

1

你只需要適當地給你打電話。沒有內置的東西可以處理你的依賴關係。

同時運行1,2,3,Start-Job

他們

等待的同時Start-Job

等待它們得到完成Get-Job -State Running | Wait-Job

運行6,等待它得到完成Get-Job -State Running | Wait-Job

運行4,5。同時Start-Job

+0

您提到的方式就像通過硬編碼一樣。可能會添加更多的腳本文件,並且依賴關係也會改變。一些算法可能會有好處。 – Samselvaprabu 2012-02-03 06:29:48

5

你需要看的PowerShell 3.0工作流程

運行7,8。它提供了您需要的功能。類似這樣的:

workflow Install-myApp { 
    param ([string[]]$computername) 
    foreach -parallel($computer in $computername) { 
     "Installing MyApp on $computer" 
     #Code for invoking installer here 
     #This can take as long as 30mins and may reboot a couple of times 
    } 
} 

workflow Install-MyApp2{ 
    param ([string[]]$computername) 
    foreach -parallel($computer in $computername) { 
     "Installing MyApp2 on $computer" 
     #Code for invoking installer here 
     #This can take as long as 30mins! 
    } 
} 

WorkFlow New-SPFarm { 
    Sequence { 
     Parallel { 
      Install-MyApp2 -computername "Server2","Server3" 
      Install-MyApp -computername "Server1","Server4","Server5" 
     } 
     Sequence { 
      #This activity can happen only after the set of activities in the above parallel block are complete" 
      "Configuring First Server in the Farm [Server1]" 

      #The following foreach should take place only after the above activity is complete and that is why we have it in a sequence 
      foreach -parallel($computer in $computername) { 
       "Configuring SharePoint on $computer" 
      } 
     } 
    } 
} 
+0

偉大的提示。我認爲它會實現一些算法的一點點補充。 – Samselvaprabu 2012-02-03 08:12:38

+1

良好的工作流程:-)當它變得廣泛可用時,這將是一個不錯的功能。 OP仍然需要手動佈置並行和順序分組的順序,與後臺作業所需的順序相同。我認爲他正在尋找如何使用SCM來管理啓動順序的Windows服務依賴關係的工作 – 2012-02-03 08:12:42

+0

實際上,您可以使用適當的順序和並行活動順序來實現。我並沒有真正想看看他正在尋找的確切順序。但是,這個通用模板應該是一個很好的起點。 – ravikanth 2012-02-03 09:06:34