2017-02-16 136 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