问题描述: 服务器注销后,所有与用户相关的正在运行的.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