当前位置: 首页 > news >正文

IIS应用程序池监控

最近发现公司运行的web网站应用程序池会突然停止,做的负载均衡(路由负载)又无法监测到IIS应用程序池的情况,就想着通过某一种监控方式监测IIS应用程序池的情况,如果处关闭状态则立刻重新启动.所说的IIS应用程序池监控也只能算是伪监控,不喜勿喷.

运行: winform + windows计划任务

1.首先获取IIS版本号

    /// <summary>
    /// 获取当前计算机相关信息
    /// </summary>
    public static class AcquireComputerInfo
    {
        /// <summary>
        /// 获取当前IIS版本号
        /// </summary>
        /// <param name="domainname"></param>
        /// <returns></returns>
        public static string GetIssVersionByDri(string domainname = "")
        {
            //try
            //{
            //    if (string.IsNullOrEmpty(domainname))
            //    {
            //        //如果为空 则默认为本地机器
            //        domainname = "LOCALHOST";
            //    }
            //    DirectoryEntry getEntity = new DirectoryEntry("IIS://" + domainname + "/W3SVC/INFO");
            //    string Versions = getEntity.Properties["MajorIISVersionNumber"].Value.ToString();
            //    return Versions;
            //}
            //catch (Exception se)
            //{
            //    //说明一点:IIS5.0中没有(int)entry.Properties["MajorIISVersionNumber"].Value;属性,将抛出异常 证明版本为 5.0
            //    //MessageBox.Show("获取ISS的版本是发生异常信息:" + se.Message);
            //    return "5.0";
            //}

            //RegistryKey表示 Windows 注册表中的项级节点.此类是注册表封装
            string issversion = string.Empty;
            RegistryKey getkey = Registry.LocalMachine.OpenSubKey("software\\microsoft\\inetstp");
            if (getkey != null)
            {
                issversion = Convert.ToInt32(getkey.GetValue("majorversion", -1)).ToString();
                //MessageBox.Show(issversion.ToString());
            }
            return issversion;
        }
        /// <summary>
        /// 获取当前计算机信息   例如:计算机名:aaa,IP:10.10.10.10
        /// </summary>
        /// <returns></returns>
        public static string GetComputerInfo()
        {
            var computerNmae = System.Net.Dns.GetHostName();//获取当前计算机名称
            var computerIp = new System.Net.IPAddress(System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()).AddressList[0].Address).ToString();//获取局域网IP

            return string.Format("PC_Name: {0},IP: {1}",computerNmae,computerIp);
        } 
    }
获取当前计算机相关信息

2.查看当前iis上所有的应用程序池的       

        /// <summary>
/// 检测当前线程池是否正常开启 /// </summary> public void MonitoringISSAppPool() { // string method_Recycle = "Recycle"; //Start开启 Recycle回收 Stop 停止 string method_Start = "Start"; var i = 0; DirectoryEntry appPool = new DirectoryEntry("IIS://localhost/W3SVC/AppPools"); try { foreach (DirectoryEntry item in appPool.Children) { string AppPoolCommand = item.Properties["ManagedPipelineMode"].Value.ToString(); string ManagedRuntimeVersion = item.Properties["ManagedRuntimeVersion"].Value.ToString();//,net版本号 string AppPoolState = item.Properties["AppPoolState"].Value.ToString();//当前状态 if (AppPoolState != "2") { DirectoryEntry findPool = appPool.Children.Find(item.Name, "IIsApplicationPool"); findPool.Invoke(method_Start, null); appPool.CommitChanges(); appPool.Close(); var IIsMsg = string.Format("[{0}],名称:[{1}],NET版本:{2},标识:{3},当前状态:[{4}],时间:{5}\n", PC_Info, item.Name, ManagedRuntimeVersion, item.SchemaClassName, "已启动", DateTime.Now.ToString()); ClsLogHelper.m_CreateWorkLogTxt(item.Name, IIsMsg); } } //lblCount_text.Text = i.ToString(); } catch (Exception ex) { ClsLogHelper.m_CreateErrorLogTxt("MonitoringISSAppPool", string.Format("{0},时间:{1},启动失败", AcquireComputerInfo.GetComputerInfo(), DateTime.Now), ex.Message);//日志记录错误信息 ClsLogHelper.Email("MonitoringISSAppPool", string.Format("{0},时间:{1},启动失败", AcquireComputerInfo.GetComputerInfo(), DateTime.Now)+" "+ ex.Message);//邮件发送错误信息 } }

3.那么剩下就是windows计划任务的工作了,简单配置一下设置触发器时间为每隔1秒中执行一次

到此一个IIS应用程序池伪监控就已经完成,当然在启动应用程序池时,启动失败时还需要记录详细的错误信息,以及将发生错误的服务器名称和IP通过邮件的方式发送给管理员,管理员可以在第一时间知道具体那台服务器IIS出现问题.

日志记录:

通过日志记录我们可以发现在第二条记录中Audi这个应用程序池已经被正常启动.

当然这种小工具只能临时解决IIS应用程序池意外停止的问题,IIS应用程序池意外停止可能有很多原因导致,例如:内存溢出或者代码逻辑问题,要想根本解决就只能安排程序员检查代码了.

 

不喜勿喷,如果有什么更好的意见或者想法欢迎提出宝贵意见哦....

转载于:https://www.cnblogs.com/aaronguo/p/3853009.html

相关文章:

  • 理解 backbone.js 中的 bind 和 bindAll 方法,关于如何在方法中指定其中的 this,包含apply方法的说明...
  • 距离变换DT
  • 2-3. 逆序的三位数(10)
  • 发布/订阅消息传送模型
  • android 永不关闭toast
  • ZOJ 2770 Burn the Linked Camp(spfabellman)
  • Frontend Development
  • hdoj 1686 kmp
  • CCS教程
  • windows安装配置mongodb及图形工具MongoVUE
  • iOS中的NSBundle常用方法
  • JAVA static 作用
  • Android 创建项目时出现appcompat_v7 类包的问题
  • Java 定时循环运行程序
  • 微信分享自定义标题和图片的js
  • 4. 路由到控制器 - Laravel从零开始教程
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • CentOS6 编译安装 redis-3.2.3
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • es6
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • java2019面试题北京
  • Java应用性能调优
  • Laravel 中的一个后期静态绑定
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • NSTimer学习笔记
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 百度小程序遇到的问题
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 设计模式走一遍---观察者模式
  • 通过npm或yarn自动生成vue组件
  • 推荐一个React的管理后台框架
  • 微信公众号开发小记——5.python微信红包
  • 应用生命周期终极 DevOps 工具包
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • (2.2w字)前端单元测试之Jest详解篇
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (分布式缓存)Redis哨兵
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (四)鸿鹄云架构一服务注册中心
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)母版页和相对路径
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .gitattributes 文件
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .NET下ASPX编程的几个小问题
  • .NET与 java通用的3DES加密解密方法
  • .pop ----remove 删除
  • @RequestMapping处理请求异常