Merge branch 'github_master' of http://git.newlifex.com/NewLife/Stardust into github_master

* 'github_master' of http://git.newlifex.com/NewLife/Stardust:
  改善用户体验:添加返回主菜单选项
  增强服务重启功能及日志记录
This commit is contained in:
猿人易 2025-07-11 10:39:16 +08:00
commit fd9245d274
4 changed files with 96 additions and 18 deletions

View File

@ -36,13 +36,14 @@ public class RestartService : BaseCommandHandler
var status = es != null ? "运行中" : "已停止";
XTrace.WriteLine("{0}. {1} ({2})", i + 1, svc.Name, status);
}
XTrace.WriteLine("0. 返回主菜单");
// 获取用户输入
XTrace.WriteLine("请输入服务序号或名称");
XTrace.WriteLine("请输入服务序号或名称0 返回主菜单)");
var input = Console.ReadLine();
if (String.IsNullOrEmpty(input))
if (String.IsNullOrEmpty(input) || input == "0")
{
XTrace.WriteLine("操作已取消");
XTrace.WriteLine("返回主菜单...");
return;
}

View File

@ -34,13 +34,14 @@ public class StartService : BaseCommandHandler
var svc = services.Services[i];
XTrace.WriteLine("{0}. {1}", i + 1, svc.Name);
}
XTrace.WriteLine("0. 返回主菜单");
// 获取用户输入
XTrace.WriteLine("请输入服务序号或名称");
XTrace.WriteLine("请输入服务序号或名称0 返回主菜单)");
var input = Console.ReadLine();
if (String.IsNullOrEmpty(input))
if (String.IsNullOrEmpty(input) || input == "0")
{
XTrace.WriteLine("操作已取消");
XTrace.WriteLine("返回主菜单...");
return;
}

View File

@ -38,13 +38,14 @@ public class StopService : BaseCommandHandler
XTrace.WriteLine("{0}. {1} (PID: {2})", i + 1, svc.Name, es.ProcessId);
}
}
XTrace.WriteLine("0. 返回主菜单");
// 获取用户输入
XTrace.WriteLine("请输入服务序号或名称");
XTrace.WriteLine("请输入服务序号或名称0 返回主菜单)");
var input = Console.ReadLine();
if (String.IsNullOrEmpty(input))
if (String.IsNullOrEmpty(input) || input == "0")
{
XTrace.WriteLine("操作已取消");
XTrace.WriteLine("返回主菜单...");
return;
}

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;
}
// 等待服务完全停止
Thread.Sleep(1000);
// 检查服务是否正在运行
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);
}
else
{
XTrace.WriteLine("服务[{0}]未运行,直接启动", serviceName);
span?.AppendTag("DirectStart");
}
// 启动服务(无论之前是否运行)
XTrace.WriteLine("启动服务[{0}]", serviceName);
span?.AppendTag("StartService");
// 再启动服务
var startResult = manager.Start(serviceName);
return startResult == true;
if (startResult == true)
{
XTrace.WriteLine("服务[{0}]重启成功", serviceName);
span?.AppendTag("Success");
return true;
}
else
{
XTrace.WriteLine("服务重启失败:无法启动服务[{0}]", serviceName);
span?.AppendTag("StartFailed");
return false;
}
}
catch
catch (Exception ex)
{
XTrace.WriteLine("服务[{0}]重启时发生异常:{1}", serviceName, ex.Message);
span?.SetError(ex, null);
return false;
}
}