服务器监控,一定时间内或者iis异常就需要重启线程池和站点,下面我们用代码来做这个功能
重启站点:
复制代码 代码如下: /// <summary> /// 根据名字重启站点.(没重启线程池) /// </summary> /// <param name="sitename"></param> static void RestartWEbSite(string sitename) { try { var server = new ServerManager(); var site = server.Sites.FirstOrDefault(s => s.Name == sitename); if (site != null) { site.Stop(); if (site.State == ObjectState.Stopped) { } else { Console.WriteLine("Could not stop website!"); throw new InvalidOperationException("Could not stop website!"); } site.Start(); } else { Console.WriteLine("Could not find website!");
throw new InvalidOperationException("Could not find website!"); }
} catch (Exception e) { Console.WriteLine(e); } }
/// <summary> /// 重启完之后.要再检测下.是否开启了 /// </summary> /// <param name="sitename"></param> static void FixWebsite(string sitename) { try { var server = new ServerManager(); var site = server.Sites.FirstOrDefault(s => s.Name == sitename); if (site != null) { if (site.State != ObjectState.Started) { Thread.Sleep(500);
//防止状态为正在开启 if (site.State != ObjectState.Started) { site.Start(); } } } } catch (Exception e) { Console.WriteLine(e); } }
重启iis线程池:
复制代码 代码如下: /// <summary> /// 线程池名字 /// </summary> /// <param name="name"></param> static void RestartIISPool(string name) { string[] cmds = { "c:", @"cd %windir%\system32\inetsrv", string.Format("appcmd stop apppool /apppool.name:{0}", name), string.Format("appcmd start apppool /apppool.name:{0}", name) }; Cmd(cmds); CloseProcess("cmd.exe"); }
/// <summary> /// 运行CMD命令 /// </summary> /// <param name="cmd">命令</param> /// <returns></returns> public static string Cmd(string[] cmd) { Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); p.StandardInput.AutoFlush = true; for (int i = 0; i < cmd.Length; i++) { p.StandardInput.WriteLine(cmd[i]); } p.StandardInput.WriteLine("exit");
string strRst = p.StandardOutput.ReadToEnd();
//Debug.Print(strRst);
p.WaitForExit(); p.Close(); return strRst; }
/// <summary> /// 关闭进程 /// </summary> /// <param name="ProcName">进程名称</param> /// <returns></returns> public static bool CloseProcess(string ProcName) { bool result = false; var procList = new ArrayList(); foreach (Process thisProc in Process.GetProcesses()) { var tempName = thisProc.ToString(); int begpos = tempName.IndexOf("(") + 1; int endpos = tempName.IndexOf(")"); tempName = tempName.Substring(begpos, endpos - begpos); procList.Add(tempName); if (tempName == ProcName) { if (!thisProc.CloseMainWindow()) thisProc.Kill(); // 当发送关闭窗口命令无效时强行结束进程 result = true; } } return result; }
|