我在 vb.net(VS2017,目標 .net framework 4.5)中開發了一個windows 服務。
Windows 服務會自動執行 sql-server 備份(基于計時器)、洗掉舊備份檔案、讀取和寫入 .ini 檔案并在某些情況下發送電子郵件以及 - 詛咒 - 寫入事件日志。該服務必須在Windows Server 2019(標準)上運行。
一切都按預期作業——除了 OnShutdown() 事件的處理,這讓我抓狂,因為它是一個“移動目標”。
如果服務器關閉(正常情況應該是“重啟”),我想:
- 登錄事件日志
- 寫入.ini
- 發送電子郵件
我的代碼zu OnShutdown():
Protected Overrides Sub OnShutdown()
cModul = "OnShutdown()"
ProtokollSchreiben("Der Server wird heruntergefahren...", Typ_Warning)
'
DebugProtokollSchreiben("Timer stoppen und anhalten...", Typ_Warning)
MyTimer.Stop()
MyTimer.Enabled = False
DebugProtokollSchreiben("Timer gestoppt und angehalten...", Typ_Warning)
DebugProtokollSchreiben("Der Server wird heruntergefahren...", Typ_Warning)
DebugProtokollSchreiben("Vor schreiben .ini...", Typ_Warning)
cIniFile.WriteInteger("WindowsService", "ServerWurdeGebooted", 1)
DebugProtokollSchreiben("Nach schreiben .ini...", Typ_Warning)
DebugProtokollSchreiben("Vor MailversandServerReboot...", Typ_Warning)
MailversandServerReboot()
cModul = "OnShutdown()"
DebugProtokollSchreiben("Nach MailversandServerReboot...", Typ_Warning)
'
MyBase.OnShutdown()' call “original event”
End Sub
備注:
我設定:
Me.CanShutdown = True
在設計器代碼中并在事件日志中寫入啟動時的實際值(CanShutdown在運行時設定為 true)。
在 ProtokollSchreiben() 和 DebugProtokollSchreiben() 中只寫入日志條目。在 MailversandServerReboot() 中,通過 SMTP 發送電子郵件(這在服務的其他部分中有效,沒有問題)。
行為:
- 有時會呼叫事件(OnShutdown(),有時不會
- 如果它被呼叫,大多數情況下,事件日志中的最后一個事件是“Vor schreiben .ini ...”(= 在寫入 .ini 檔案之前)
- -> 在這種情況下,有時會更新 .ini(盡管下一個日志條目“Nach schreiben .ini...”不會寫入事件日志),有時不會
我已經搜索了互聯網并閱讀了這個 SO-Links:
“根目錄”是\prog\ ( 1 )。在子目錄\SaveRebootFlags\ ( 2 )中,每次重新啟動都會保存一個標志檔案。
任何檔案 ( 3 )都包含一個帶有服務器關閉時間戳的文本(而不是重新啟動 Windows 服務) 在“根目錄” \prog\ ( 1 )中寫入了一個類似的標志檔案,
但沒有日期時間戳 (只有(4))...所以這個檔案名總是一樣的。
在服務的OnStart()中,我檢查標志檔案是否存盤在“根目錄” \Prog\ ( 1 )中。
如果是,則會發送一封電子郵件“服務器在'標志檔案中的時間戳'時關閉,Windows 服務已重新啟動并再次作業......”。
發送郵件后,“主標志檔案”被自動洗掉。
注意:由于我們在(2)中也有檔案,因此我們可以理解任何重新啟動。
這不是我最初想要的,但它有效(至少對我來說;-)。
也許這對某人有幫助,那也因奇怪的行為而“絆倒”了……
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/430848.html
標籤:VB.net 窗口服务 windows-server-2019
上一篇:以物件陣列作為欄位的物件陣列
