增强服务重启功能及日志记录

在 `StarService.cs` 中添加了多个命名空间引用以支持新功能。
改进了 `InternalRestartService` 方法,增加了详细的日志记录和错误处理,移除了原有的服务停止逻辑,并新增了 `GetRestartFailureMessage` 方法以提供重启失败的详细原因。
同时,增强了异常处理,便于后续故障排查。
This commit is contained in:
猿人易 2025-07-05 10:37:21 +08:00
parent 242f5ea202
commit e1583f22aa
1 changed files with 84 additions and 9 deletions

View File

@ -1,5 +1,6 @@
using System.Collections.Concurrent;
using System.Diagnostics;
using NewLife;
using NewLife.Agent;
using NewLife.Data;
@ -9,6 +10,7 @@ using NewLife.Net;
using NewLife.Remoting;
using NewLife.Remoting.Models;
using NewLife.Threading;
using Stardust;
using Stardust.Managers;
using Stardust.Models;
@ -259,10 +261,14 @@ public class StarService : DisposeBase, IApi
{
// 使用共同的重启逻辑
var success = InternalRestartService(Manager, serviceName, "API调用重启");
// 根据结果提供更详细的信息
var message = success ? "服务重启成功" : GetRestartFailureMessage(Manager, serviceName);
return new ServiceOperationResult
{
Success = success,
Message = success ? "服务重启成功" : "服务重启失败",
Message = message,
ServiceName = serviceName
};
}
@ -277,6 +283,25 @@ public class StarService : DisposeBase, IApi
}
}
/// <summary>获取重启失败的详细原因</summary>
private static String GetRestartFailureMessage(ServiceManager manager, String serviceName)
{
if (manager?.Services?.Any(e => e.Name.EqualIgnoreCase(serviceName)) != true)
{
return "服务不存在";
}
var isRunning = manager.RunningServices?.Any(e => e.Name.EqualIgnoreCase(serviceName)) == true;
if (isRunning)
{
return "服务重启失败:停止服务失败";
}
else
{
return "服务重启失败:启动服务失败";
}
}
private void DoRefreshLocal(Object state)
{
var ai = AgentInfo.GetLocal(true);
@ -543,21 +568,71 @@ public class StarService : DisposeBase, IApi
{
if (manager == null || serviceName.IsNullOrEmpty()) return false;
using var span = DefaultTracer.Instance?.NewSpan(nameof(InternalRestartService), new { serviceName, reason });
try
{
// 先停止服务
var stopResult = manager.Stop(serviceName, reason);
if (stopResult != true) return false;
// 检查服务是否存在
var service = manager.Services?.FirstOrDefault(e => e.Name.EqualIgnoreCase(serviceName));
if (service == null)
{
XTrace.WriteLine("服务重启失败:服务[{0}]不存在", serviceName);
span?.AppendTag("ServiceNotFound");
return false;
}
// 检查服务是否正在运行
var runningServices = manager.RunningServices;
var isRunning = runningServices?.Any(e => e.Name.EqualIgnoreCase(serviceName)) == true;
XTrace.WriteLine("开始重启服务[{0}],当前状态:{1},原因:{2}", serviceName, isRunning ? "运行中" : "已停止", reason);
if (isRunning)
{
// 服务正在运行,先停止服务
XTrace.WriteLine("停止服务[{0}]", serviceName);
span?.AppendTag("StopService");
var stopResult = manager.Stop(serviceName, reason);
if (stopResult != true)
{
XTrace.WriteLine("服务重启失败:无法停止服务[{0}]", serviceName);
span?.AppendTag("StopFailed");
return false;
}
XTrace.WriteLine("服务[{0}]停止成功等待1秒后启动", serviceName);
// 等待服务完全停止
Thread.Sleep(1000);
// 再启动服务
var startResult = manager.Start(serviceName);
return startResult == true;
}
catch
else
{
XTrace.WriteLine("服务[{0}]未运行,直接启动", serviceName);
span?.AppendTag("DirectStart");
}
// 启动服务(无论之前是否运行)
XTrace.WriteLine("启动服务[{0}]", serviceName);
span?.AppendTag("StartService");
var startResult = manager.Start(serviceName);
if (startResult == true)
{
XTrace.WriteLine("服务[{0}]重启成功", serviceName);
span?.AppendTag("Success");
return true;
}
else
{
XTrace.WriteLine("服务重启失败:无法启动服务[{0}]", serviceName);
span?.AppendTag("StartFailed");
return false;
}
}
catch (Exception ex)
{
XTrace.WriteLine("服务[{0}]重启时发生异常:{1}", serviceName, ex.Message);
span?.SetError(ex, null);
return false;
}
}