2011-04-07 43 views
3

我在Windows Azure工作角色中有一個啓動任務。此啓動任務對需要在VM中重新引導的註冊表進行更改。所以我需要一種方式來表明它需要重啓的角色。在Azure中,啓動任務如何與包含它的角色通信?

到目前爲止,我的解決方案是讓Startup Task創建一個虛擬文件,如果它發現註冊表已被修改(這意味着該角色已重新啓動)。所以角色第一次運行時,它找不到虛擬文件,所以它會拋出未處理的異常,導致角色重新啓動。

下一次啓動任務再次啓動並創建虛擬文件,這樣我們就不會陷入無限循環。

這聽起來像一個非常hacky的解決方案。有沒有更好的方法來做到這一點?我認爲一個簡單的方法是強制從啓動任務重新啓動,但無法找到如何做到這一點。

+1

對於任何人在這個問題上磕磕絆絆:沒有什麼hacky或不清楚寫作和檢查文件的存在。這個方法至少被認可[在這裏](https://msdn.microsoft.com/en-us/library/azure/jj129544.aspx)和[here](https://msdn.microsoft.com/en-us /library/hh290696(v=sql.110).aspx)。在我看來,它是*更*維護和乾淨,只是檢查一個文件。如果您正在檢查特定的註冊表項,現在您有*兩個*位置可以更改代碼(編寫代碼和檢查代碼),如果註冊表項位置發生更改.. – mellamokb 2015-08-11 13:29:34

回答

4

是的,這似乎是合理的。但是,如果您要更改註冊表,爲什麼不直接檢查註冊表以查看是否已更改註冊表?只需將您的安裝程序放入腳本(例如yourinstaller.cmd)中,但在啓動之前先調用另一個腳本來檢查(例如startup.cmd)。 'youinstaller.cmd'將始終重新啓動。合理?

@echo off 
setlocal 
set regpath=HKCU\Software\Microsoft\Windows\CurrentVersion\Foo\Bar 
set regvalue=SomeKeyYouSet 
set regdata=SomeValueYouSet 
reg query "%regpath%" /v "%regvalue%" | find /i "%regdata%" 
if errorlevel 1 (
    echo Data Not Found! 
    call yourinstaller.cmd 
    EXIT /B /0 
) 
+0

謝謝!我認爲這絕對比我目前的解決方案更清潔,並且不存在將文件作爲標記(這是David評論的片狀)的問題。 – krolth 2011-04-08 20:16:33

0

我無法想象臨時文件技術將如何工作。每次重啓實例時,都需要安裝註冊表值。您不能依賴於角色回收後保留的註冊表值,也無法有條件地運行啓動任務。

能否詳細說一下爲什麼需要在更新註冊表後重啓?如果確實有這種情況,必須在引導之前設置這些註冊表值,那麼您應該查看VM角色。但好奇心正在殺死這隻貓。

+0

David,您爲什麼認爲我不能依賴註冊表值堅持?它爲我工作,我記得從收看重播角色的頻道9視頻是可能的。某些註冊表配置單元的更改只能在重新啓動機器後纔會發生(不包括更改,但對系統有影響)。 – krolth 2011-04-08 02:05:41

+0

如果您的實例使用新操作系統更新,或者在另一臺服務器上重新啓動,會發生什麼情況?這是全新的重啓。除非您構建VM角色,否則註冊表更改不是您角色定義的一部分。所以,如果你尋找你的臨時文件並且它在那裏,你可能會錯誤地認爲你已經設置了reg值。 – 2011-04-08 05:08:21

+0

如果操作系統在不同的服務器上更新或啓動,則啓動任務將再次運行並重新生成註冊表更改(該文件僅用於與角色進行通信)。或者,這是我對啓動任務如何工作的理解 - 只要操作系統啓動就會運行它們。 – krolth 2011-04-08 20:21:52

3

根據this blog post這似乎做了一些非常類似於你想要做的事情,你不是太遙遠。它使用了一個類似的臨時文件技巧,但是在批處理文件中以及重新啓動時都會這樣做。爲了重新開始工作,他們使用shutdown command

相關問題