這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
問題描述: 伺服器登出後,所有與使用者相關的正在啟動並執行.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項目 (注意版本)
核心代碼:
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:\Go\src\myweb\myweb.exe