0
我有一個用當前正在運行的託管語言(.NET Framework v4.0)編寫的Windows服務。爲什麼我能夠在運行時重命名Windows Service可執行文件?
出於某種原因,我可以在服務運行時重命名服務主可執行文件。 當服務運行時,我會懷疑該文件被Windows鎖定,但這不會出現這種情況。 更有趣的是,它在重命名後仍然存在於任務管理器中。
我不抱怨這是可能的,但我想知道爲什麼。任何人對此有解釋?
我有一個用當前正在運行的託管語言(.NET Framework v4.0)編寫的Windows服務。爲什麼我能夠在運行時重命名Windows Service可執行文件?
出於某種原因,我可以在服務運行時重命名服務主可執行文件。 當服務運行時,我會懷疑該文件被Windows鎖定,但這不會出現這種情況。 更有趣的是,它在重命名後仍然存在於任務管理器中。
我不抱怨這是可能的,但我想知道爲什麼。任何人對此有解釋?
從this answer on superuser, 和How can we overwrite EXE files while users are running them?,
可執行文件未完全鎖定兩者,可以重新命名。 Windows服務管理器獲取服務可執行文件上的文件句柄,只要該服務運行,服務可執行文件就會保持打開狀態,並且完全不受重命名的影響。它不會鎖定目錄條目本身。所以可執行文件可以被其他進程讀取,並且文件的目錄條目可以被重命名。
意義:
建議:
沒有什麼特別的Windows服務,特別是。見[這個超級用戶的問題](https://superuser.com/q/488127/59978) –
功能,而不是一個錯誤。操作系統會鎖定文件數據,而不是目錄條目。這是在程序運行時爲程序安裝更新的基本方法。 –
在服務重新啓動之前,它不會拾取新的可執行映像。如果依賴於此機制的更新過程容易出現不一致(如果它們未能執行服務控制命令(例如由於缺少權限),並且系統最終處於文件爲新狀態但服務正在運行的狀態一個未被注意的舊圖像。那麼突然,當服務器重新啓動時,功能更改或更新中的錯誤變得明顯。在生產環境中不僅看過一次,從此以後就避免了。 – dlatikay