2017-02-16 60 views
0

我們在Azure自動化中設置了多個Runbook來備份數據庫。多個Runbook在AzureProfile.json上拒絕訪問

我們有4個Runbook,一個用於我們希望備份的每個數據庫。

每個運行手冊的調用到子運行手冊(DBBackup.ps1)中,用特定的參數,以確定數據庫中備份,文件名前綴對所產生的斑點等

DBBackup.ps1具有用於選擇在Azure代碼帳戶和訂閱,然後執行備份。

我們有一個日程安排,每天凌晨1點運行,並且4個數據庫Runbook與此計劃相關聯。

這一切都很好,有時。

我們與結束了是因爲這些運行手冊並行運行,有時,當他們嘗試設置帳戶和訂閱,他們得到了以下錯誤:

The process cannot access the file 'C:\Users\Client\AppData\Roaming\Windows Azure Powershell\AzureProfile.json' because it is being used by another process. (The process cannot access the file 'C:\Users\Client\AppData\Roaming\Windows Azure Powershell\AzureProfile.json' because it is being used by another process.)

我不是真的我確信在這裏要做什麼,因爲我認爲當他們作爲單獨的工作來運行時,它們將被隔離。

任何幫助表示讚賞。從評論

更新:

我意識到,我都可以在重試邏輯這個包起來。我想了解的是,爲什麼我認爲四個獨立的作業將彼此隔離,試圖訪問相同的本地文件。

由於我一夜之間結果的例子:

Example job list

該列表中的第二和第四個作業失敗,因爲AzureProfile.json被鎖定。

+0

嗯,這是什麼問題?這很明顯,實現一個重試邏輯來讀取每個Runbook中的文件? – 4c74356b41

+0

是的,我可以在那裏添加重試邏輯,但我顯然不理解這些工作的隔離並希望。 – Carl

+0

它與隔離無關,你試圖訪問一個文件,不管你如何隔離這些作業,他們不能同時訪問同一個文件,如果該文件被鎖定的話...... – 4c74356b41

回答

2

當您在Azure上運行Azure自動化操作手冊(與混合工作者相比)時,會生成沙箱環境以運行該作業。爲了保護目的,同時運行的作業通常最終會使用相同的沙箱環境。在這種情況下,AzureProfile.json文件似乎正在寫入,以便存儲您引用的訂閱。由於您試圖編寫和更改每個Runbook的訂閱,因此會生成寫入錯誤。爲了解決這個問題,我建議您將序列化Runbook或創建多個Azure自動化帳戶,以便同時單獨運行每個帳戶。


編輯:ASM cmdlet具有Profile參數作爲內置解決方法,但是ARM cmdlet尚不支持此參數。如果這影響了你,我鼓勵你在GitHub上註冊這個問題(https://github.com/Azure/azure-powershell/issues/1257)。與此同時,您可以使用下面的代碼來鎖定沙箱,確保它們落在同一個沙箱中,以便線程序列化。

$LockName = $pid 
Write-Verbose "Using lock $lockName"; 
$Lock = New-Object System.Threading.Mutex($false, $LockName); 
$Lock.WaitOne(); 
try 
{ 

} 
finally 
{ 
    $Lock.ReleaseMutex(); 
    $Lock.Dispose(); 
} 
+0

謝謝珍妮,我現在已經完成了鎖定,並且從此沒有任何失敗。 – Carl