-
在生产环境有时候部署的程序可能会因为意外情况被关闭
- 程序异常
- 系统异常
- 人为误操作
- 。。。
-
程序有需要永久开启的需求,这个时候需要有守护程序监测服务或者程序是否关闭,如果关闭了则再次启动。最近写了个简易的程序满足临时的需要。
-

-

-
通过配置文件设置对应需要守护的路径或名称。
-
"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;
}
}
基于winform的应用守护程序-支持服务与应用程序
11eleven2024-05-13 19:20
相关推荐
峥无7 小时前
Linux进程信号:从基础概念到内核底层原理广州灵眸科技有限公司7 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) 开发(编译)方式说明土星云SaturnCloud7 小时前
土星云AI边缘计算SE110S系列模型部署实战-YOLOv5艾iYYY8 小时前
string 类的模拟实现cjp5608 小时前
003.LINQ在WEB API中的应用周小码8 小时前
10分钟搭建私有Git服务器:Soft Serve实战知无不研9 小时前
对套接字的深入理解Song_da_da_9 小时前
C#与VisionPro联合编程实战:机器视觉二次开发完整指南ZStack开发者社区10 小时前
VMware替代:从POC通过到生产可用,差距在哪里AI创界者10 小时前
运维进阶:如何使用 Medusa 进行企业内部服务器密码合规性审计?