基于winform的应用守护程序-支持服务与应用程序

  • 在生产环境有时候部署的程序可能会因为意外情况被关闭

    • 程序异常
    • 系统异常
    • 人为误操作
    • 。。。
  • 程序有需要永久开启的需求,这个时候需要有守护程序监测服务或者程序是否关闭,如果关闭了则再次启动。最近写了个简易的程序满足临时的需要。

  • 通过配置文件设置对应需要守护的路径或名称。

  • "CheckCircle": 5000,
    //服务名称列表
    "ServiceNameList": [],
    //应用程序列表
    "ApplicationNameList": [ "D:\\MyWorkSpace\\test.exe" ]

  • 核心代码如下

  • /// <summary>

    /// 检查服务并启动

    /// </summary>

    /// <returns></returns>

    private static async Task CheckServiceAndRunAsync()

    {

    Task.Run(async () =>

    {

    while (true)

    {

    try

    {

    AppsettingsConfig.LastRunTime = DateTime.Now;

    if (AppsettingsConfig.ApplicationNameList.IsListNullOrEmpty() == false)

    {

    AppsettingsConfig.ApplicationNameList.ForEach(app =>

    {

    if (File.Exists(app))

    {

    var fileName = Path.GetFileNameWithoutExtension(app);

    var path = Path.GetDirectoryName(app);

    if (!IsProcessRunning(fileName))

    {

    WriteLogHelper.WriteLogsAsync($"{fileName}未开启,尝试重启", "重启日志");

    var isSuccess = StartProcessIfNotRunning(app, path);

    WriteLogHelper.WriteLogsAsync($"{fileName}重启结束,结果{isSuccess}", "重启日志");

    }

    }

    });

    }

    if (AppsettingsConfig.ServiceNameList.IsListNullOrEmpty() == false)

    {

    AppsettingsConfig.ServiceNameList.ForEach(app =>

    {

    if (!IsServiceRunning(app))

    {

    WriteLogHelper.WriteLogsAsync($"{app}未开启,尝试重启", "重启日志");

    var isSuccess = CheckAndRestartService(app);

    WriteLogHelper.WriteLogsAsync($"{app}重启结束,结果{isSuccess}", "重启日志");

    }

    });

    }

    }

    catch (Exception ex)

    {

    WriteLogHelper.WriteLogsAsync($"{ex.ToString()}", "重启日志异常");

    }

    await Task.Delay(5000);

    }

    });

    }

    static bool CheckAndRestartService(string serviceName)

    {

    using (var controller = new ServiceController(serviceName))

    {

    if (controller.Status != ServiceControllerStatus.Running)

    {

    Console.WriteLine($"Service '{serviceName}' is not running. Attempting to start...");

    try

    {

    controller.Start();

    controller.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(5));

    Console.WriteLine($"Service '{serviceName}' started successfully.");

    return true;

    }

    catch (Exception ex)

    {

    Console.WriteLine($"Failed to start service '{serviceName}'. Error: {ex.Message}");

    return false;

    }

    }

    else

    {

    Console.WriteLine($"Service '{serviceName}' is already running.");

    // 如果需要重启服务,取消下面注释

    // RestartService(controller);

    }

    return true;

    }

    }

    /// <summary>

    /// 检查服务是否运行

    /// </summary>

    /// <param name="serviceName"></param>

    /// <returns></returns>

    public static bool IsServiceRunning(string serviceName)

    {

    using (var serviceController = new ServiceController(serviceName))

    {

    try

    {

    return serviceController.Status == ServiceControllerStatus.Running;

    }

    catch (InvalidOperationException)

    {

    // 服务不存在

    return false;

    }

    }

    }

    static bool IsProcessRunning(string processName)

    {

    var len = Process.GetProcessesByName(processName).Length;

    return len > 0;

    }

    /// <summary>

    /// 启动应用进程

    /// </summary>

    /// <param name="processName"></param>

    static bool StartProcessIfNotRunning(string processName, string workPath)

    {

    var processStartInfo = new ProcessStartInfo(processName)

    {

    WorkingDirectory = workPath, // 设置工作目录

    CreateNoWindow = true,

    UseShellExecute = false

    };

    try

    {

    Process.Start(processStartInfo);

    return true;

    }

    catch (Exception ex)

    {

    Console.WriteLine($"Error starting '{processName}': {ex.Message}");

    return false;

    }

    }

相关推荐
杂化轨道VSEPR17 分钟前
基站计数器与KPI:移动通信网络性能评估的核心引擎
运维·服务器·网络·5g·信息与通信
似水এ᭄往昔2 小时前
【Linux】——基础指令(下)
linux·服务器
大锦终2 小时前
【Linux】udp网络程序
linux·运维·服务器·网络
罗政2 小时前
【免费】轻量级服务器centos监控程序+内存+cpu+nginx+适合小型站长使用
服务器·nginx·centos
CryptoRzz3 小时前
欧美(美股、加拿大股票、墨西哥股票)股票数据接口文档
java·服务器·开发语言·数据库·区块链
wanhengidc3 小时前
巨椰云手机引领未来
运维·服务器·网络·游戏·智能手机
wanhengidc3 小时前
云手机的真实体验感怎么样
运维·服务器·安全·游戏·智能手机
脏脏a3 小时前
【Linux】Linux工具漫谈:yum 与 vim,高效操作的 “左膀右臂”
linux·运维·服务器
九河云4 小时前
TOS + 数字孪生:集装箱码头的智能进化密码
大数据·服务器·网络·数据库·数字化转型
代码or搬砖4 小时前
文件上传阿里云OSS以及本地图片服务器搭建
服务器·阿里云·云计算