From c55ae9a35e8e6ad7114ad97f0b3aeb6f99902b10 Mon Sep 17 00:00:00 2001 From: waner Date: Wed, 13 May 2026 16:15:48 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E5=8D=87=E7=BA=A7=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../upgrade/executor/UpgradeTaskRunner.java | 23 ++++++++++++++++--- .../executor/UpgradeTaskRunnerTest.java | 20 ++++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cisd/tms/modules/upgrade/executor/UpgradeTaskRunner.java b/src/main/java/com/cisd/tms/modules/upgrade/executor/UpgradeTaskRunner.java index d92eb27..a40be3b 100644 --- a/src/main/java/com/cisd/tms/modules/upgrade/executor/UpgradeTaskRunner.java +++ b/src/main/java/com/cisd/tms/modules/upgrade/executor/UpgradeTaskRunner.java @@ -228,9 +228,7 @@ public class UpgradeTaskRunner { */ protected void triggerDetachedTmsRestart(Path logPath, boolean rollback) throws IOException { String phase = rollback ? "rollback" : "upgrade"; - String command = "nohup /home/tms/scripts/tms.sh restart >> " - + shellQuote(logPath.toString()) - + " 2>&1 < /dev/null &"; + String command = buildDetachedTmsRestartCommand(logPath); Process shell = new ProcessBuilder("bash", "-lc", command) .redirectErrorStream(true) .redirectOutput(Redirect.appendTo(logPath.toFile())) @@ -246,6 +244,25 @@ public class UpgradeTaskRunner { } } + String buildDetachedTmsRestartCommand(Path logPath) { + return "nohup bash -lc " + + shellQuote("set -e; " + + "APP_HOME=\"${APP_HOME:-/home/tms}\"; " + + "RUN_DIR=\"${RUN_DIR:-${APP_HOME}/run}\"; " + + "PENDING_META=\"${RUN_DIR}/tms-upgrade.pending-jar\"; " + + "\"${APP_HOME}/scripts/tms.sh\" stop; " + + "if [ -s \"${PENDING_META}\" ]; then " + + "PENDING_JAR=\"$(cat \"${PENDING_META}\")\"; " + + "test -s \"${PENDING_JAR}\"; " + + "cp \"${PENDING_JAR}\" \"${APP_HOME}/tms-framework.jar\"; " + + "rm -f \"${PENDING_META}\" \"${RUN_DIR}/tms-framework.jar.pending\"; " + + "fi; " + + "\"${APP_HOME}/scripts/tms.sh\" start") + + " >> " + + shellQuote(logPath.toString()) + + " 2>&1 < /dev/null &"; + } + private void writeLogLine(Path logPath, String message) throws IOException { Files.writeString( logPath, diff --git a/src/test/java/com/cisd/tms/modules/upgrade/executor/UpgradeTaskRunnerTest.java b/src/test/java/com/cisd/tms/modules/upgrade/executor/UpgradeTaskRunnerTest.java index a087368..b75dad8 100644 --- a/src/test/java/com/cisd/tms/modules/upgrade/executor/UpgradeTaskRunnerTest.java +++ b/src/test/java/com/cisd/tms/modules/upgrade/executor/UpgradeTaskRunnerTest.java @@ -173,6 +173,26 @@ class UpgradeTaskRunnerTest { Assertions.assertTrue(log.contains("scheduling detached TMS restart")); } + @Test + void detachedTmsRestartCommandAppliesPendingJarAfterStopAndBeforeStart() throws Exception { + UpgradeTaskRunner runner = new UpgradeTaskRunner( + new InMemoryUpgradeTaskRepository(), + new InMemoryFileRecordRepository(), + new InMemoryDeviceSoftwareVersionRepository(), + stagingService(Files.createTempDirectory("upgrade-staging"), Files.createTempDirectory("upgrade-logs")), + properties(Files.createTempDirectory("upgrade-staging-props"), Files.createTempDirectory("upgrade-logs-props")), + objectMapper + ); + + String command = runner.buildDetachedTmsRestartCommand(Path.of("/home/tms/tmp/tms-upgrade-logs/UPG-001.log")); + + Assertions.assertTrue(command.contains("PENDING_META")); + Assertions.assertTrue(command.contains("tms-upgrade.pending-jar")); + Assertions.assertTrue(command.contains("cp \"${PENDING_JAR}\" \"${APP_HOME}/tms-framework.jar\"")); + Assertions.assertTrue(command.indexOf("\"${APP_HOME}/scripts/tms.sh\" stop") < command.indexOf("cp \"${PENDING_JAR}\"")); + Assertions.assertTrue(command.indexOf("cp \"${PENDING_JAR}\"") < command.indexOf("\"${APP_HOME}/scripts/tms.sh\" start")); + } + private UpgradeProperties properties(Path stagingRoot, Path logDir) { UpgradeProperties properties = new UpgradeProperties(); properties.setStagingRootDir(stagingRoot.toString());