2017-03-17 46 views
0

我有一個用當前正在運行的託管語言(.NET Framework v4.0)編寫的Windows服務。爲什麼我能夠在運行時重命名Windows Service可執行文件?

出於某種原因,我可以在服務運行時重命名服務主可執行文件。 當服務運行時,我會懷疑該文件被Windows鎖定,但這不會出現這種情況。 更有趣的是,它在重命名後仍然存在於任務管理器中。

我不抱怨這是可能的,但我想知道爲什麼。任何人對此有解釋?

+2

沒有什麼特別的Windows服務,特別是。見[這個超級用戶的問題](https://superuser.com/q/488127/59978) –

+1

功能,而不是一個錯誤。操作系統會鎖定文件數據,而不是目錄條目。這是在程序運行時爲程序安裝更新的基本方法。 –

+0

在服務重新啓動之前,它不會拾取新的可執行映像。如果依賴於此機制的更新過程容易出現不一致(如果它們未能執行服務控制命令(例如由於缺少權限),並且系統最終處於文件爲新狀態但服務正在運行的狀態一個未被注意的舊圖像。那麼突然,當服務器重新啓動時,功能更改或更新中的錯誤變得明顯。在生產環境中不僅看過一次,從此以後就避免了。 – dlatikay

回答

1

this answer on superuser, 和How can we overwrite EXE files while users are running them?

可執行文件未完全鎖定兩者,可以重新命名。 Windows服務管理器獲取服務可執行文件上的文件句柄,只要該服務運行,服務可執行文件就會保持打開狀態,並且完全不受重命名的影響。它不會鎖定目錄條目本身。所以可執行文件可以被其他進程讀取,並且文件的目錄條目可以被重命名。

意義:

  • 重命名後,不同版本的文件可以放置。
  • 如果您或自動更新的過程中,未能將新版本,指向該可執行文件的任何服務都將無法啓動下一次(在重啓/重啓)
  • 如果新版本有問題,像蟲子或缺少依賴關係,則服務可能無法在下次啓動時(重新啓動/重新啓動時)
  • 當您放置新版本但未能立即重新啓動服務時,它將在任何時間變爲活動狀態管理員(和用戶)喜歡在生產環境中。

建議:

  • 不要依賴這個機制。讓您的更新過程停止服務。更新過程沒有足夠權限時更新失敗。然後替換可執行文件和所有依賴項,然後重新啓動服務。
相關問題