问题描述: 服务器注销后,所有与用户相关的正在运行的.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
有疑问加站长微信联系(非本文作者)