Skip to content

Commit

Permalink
[improv]自动更新后,拉起新进程时可能失败,需要重试。在A4上执行StarAgent自动更新时,有一定几率无法自动重启。
Browse files Browse the repository at this point in the history
  • Loading branch information
nnhy committed Nov 16, 2024
1 parent 41b57bb commit 0eb5f38
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 10 deletions.
16 changes: 13 additions & 3 deletions NewLife.Remoting/Clients/ClientBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -841,7 +841,7 @@ private async Task CheckUpgrade(Object? data)
// 执行更新,解压缩覆盖文件
var rs = ug.Update();

// 执行前置命令
// 执行更新后命令
if (rs && !info.Executor.IsNullOrEmpty()) ug.Run(info.Executor);
_lastVersion = info.Version;

Expand All @@ -854,6 +854,7 @@ private async Task CheckUpgrade(Object? data)
{
span?.SetError(ex, null);
//Log?.Error(ex.ToString());
this.WriteErrorEvent("Upgrade", $"更新失败!{ex.Message}");
throw;
}

Expand All @@ -870,12 +871,21 @@ protected virtual void Restart(Upgrade upgrade)
var name = asm.GetName().Name;
if (name.IsNullOrEmpty()) return;

// 重新拉起进程
// 重新拉起进程。对于大多数应用,都是拉起新进程,然后退出当前进程;对于星尘代理,通过新进程来重启服务。
var args = Environment.GetCommandLineArgs();
if (args == null || args.Length == 0) args = new String[1];
args[0] = "-upgrade";
var gs = args.Join(" ");

var rs = upgrade.Run(name, args.Join(" "));
// 执行重启,如果失败,延迟后再次尝试
var rs = upgrade.Run(name, gs, 3_000);
if (!rs)
{
var delay = 3_000;
this.WriteInfoEvent("Upgrade", $"拉起新进程失败,延迟{delay}ms后重试");
Thread.Sleep(delay);
rs = upgrade.Run(name, gs, 1_000);
}

if (rs)
{
Expand Down
27 changes: 21 additions & 6 deletions NewLife.Remoting/Clients/Upgrade.cs
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,14 @@ void Restore(IDictionary<String, String> dic)
}

/// <summary>启动当前应用的新进程。当前进程退出</summary>
public Boolean Run(String name, String args)
public Boolean Run(String name, String args) => Run(name, args, 3_000);

/// <summary>启动当前应用的新进程。当前进程退出</summary>
/// <param name="name"></param>
/// <param name="args"></param>
/// <param name="msWait"></param>
/// <returns></returns>
public Boolean Run(String name, String args, Int32 msWait)
{
var file = "";
if (Runtime.Windows || Runtime.Mono)
Expand All @@ -245,12 +252,20 @@ public Boolean Run(String name, String args)
}

WriteLog("拉起进程 {0} {1}", file, args);
var p = file.EndsWithIgnoreCase(".dll") ?
RunShell("dotnet", $"{file} {args}") :
RunShell(file, args);
try
{
var p = file.EndsWithIgnoreCase(".dll") ?
RunShell("dotnet", $"{file} {args}") :
RunShell(file, args);

// 如果进程在指定时间退出,说明启动失败
return p != null && (!p.WaitForExit(1000) || p.ExitCode == 0);
// 如果进程在指定时间退出,说明启动失败
return p != null && (!p.WaitForExit(msWait) || p.ExitCode == 0);
}
catch (Exception ex)
{
WriteLog("启动进程失败:{0}", ex.Message);
return false;
}
}

static Process? RunShell(String fileName, String args) => Process.Start(new ProcessStartInfo(fileName, args) { UseShellExecute = true });
Expand Down
2 changes: 1 addition & 1 deletion Samples/IoTZero/Services/MyDeviceService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ public MyDeviceService(IPasswordProvider passwordProvider, ICacheProvider cacheP
//SetChildOnline(dv, ip);

// 登录历史
WriteHistory(dv, source + "设备鉴权", true, $"[{dv.Name}/{dv.Code}]鉴权成功 " + inf.ToJson(false, false, false), ip);
WriteHistory(dv, source + "登录", true, $"[{dv.Name}/{dv.Code}]鉴权成功 " + inf.ToJson(false, false, false), ip);

var rs = new LoginResponse
{
Expand Down

0 comments on commit 0eb5f38

Please sign in to comment.