使用.net完美解決伺服器登出後go的web服務停止的問題
阿新 • • 發佈:2018-12-22
問題描述: 伺服器登出後,所有與使用者相關的正在執行的.exe檔案都會退出,正因為如此,導致了go網站的.exe程式關閉了
解決辦法:通過windows服務
網上製作windows服務的方法多的很,但是並不是所有的exe檔案都能做成服務,go build後的.exe恰好不能!所以,只能通過別的方式了:使用.net制建一個服務專案,在這個服務專案內監聽go網站的.exe程式的執行情況,如果go網站的.exe程式停止,那麼立馬在該windows服務中啟動它,所以即使登出也不怕了.
詳情如下:
1)go build 生成exe檔案 (我的在D:\Go\src\myweb\myweb.exe)
2)建立windowsService專案 (注意版本) 友情連結:windows服務簡單開發/安裝
核心程式碼:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; using System.Timers; namespace BdiaService { public partial class Bdia : ServiceBase { public Bdia() { InitializeComponent(); } /// <summary> /// 服務啟動的時候 呼叫的函式 /// </summary> /// <param name="args"></param> protected override void OnStart(string[] args) { Check2();//啟動myweb應用程式 Timer t1 = new Timer(60000); t1.Elapsed += new ElapsedEventHandler(Check);//每隔1分鐘檢查一次 t1.Start(); // 啟動計時器。 } /// <summary> /// 服務停止的時候,關閉已經啟動的myweb /// </summary> protected override void OnStop() { Process[] myprocess = Process.GetProcessesByName("myweb"); if (myprocess.Length > 0) { myprocess[0].CloseMainWindow(); myprocess[0].Close(); } } /// <summary> /// 計時器執行函式 /// </summary> /// <param name="o"></param> /// <param name="e"></param> public void Check(Object o, ElapsedEventArgs e) { Process[] myprocess = Process.GetProcessesByName("myweb");//獲取名字為myweb的程序 if (myprocess.Length > 0)//如果存在,說明已經啟動 { //關閉 // myprocess[0].CloseMainWindow(); // myprocess[0].Close(); } else//否則 啟動myweb.exe { Process.Start(@"D:\Go\src\myweb\myweb.exe"); } } public void Check2() { Process[] myprocess = Process.GetProcessesByName("myweb"); if (myprocess.Length > 0) { // myprocess[0].CloseMainWindow(); // myprocess[0].Close(); } else { Process.Start(@"D:\Go\src\myweb\myweb.exe"); } } } }
3)windowsService專案安裝部署 (只要電腦上安裝過.net,一般下面程式碼都可以,下面是我的.exe檔案路徑):
C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe D:\XXXX...XXXX\BdiaService.exe