news 2026/1/14 13:04:27

Spring Boot日志文件未生成问题排查

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot日志文件未生成问题排查
spring boot中,这是日志配置: # spring 日志管理 logging: # 日志级别 level: root: INFO # 日志文件 file: name: logs/lims-server.log # 日志滚动策略(防止日志文件过大) logback: rollingpolicy: # 单个文件最大空间 max-file-size: 10MB # 日志文件保留天数 max-history: 300 # 限制日志文件(包括历史归档文件)的总存储容量,当所有日志文件总大小超过设定值时,自动删除最旧的归档日志 total-size-cap: 10GB 这是运行jar包的命令: REM 使用简单命令运行应用(单行排版) start "lims-server" javaw -jar D:\LimsDeploy\lims-server\lims-server-1.0-SNAPSHOT.jar --server.port=8085 运行环境是windows 11,为什么程序运行后,没有在对应目录中生成日志文件呢?

根据您提供的信息,日志文件没有生成可能有以下几个原因:

1.相对路径问题(最常见)

在Windows中使用start命令时,工作目录可能不是您期望的目录。

解决方案:明确指定工作目录

bat

cd /d D:\LimsDeploy\lims-server start "lims-server" javaw -jar lims-server-1.0-SNAPSHOT.jar --server.port=8085

或者直接指定完整日志路径:

yaml

logging: file: name: D:/LimsDeploy/logs/lims-server.log # 使用绝对路径

2.目录权限问题

确保程序有在目标目录创建文件的权限。

检查步骤:

  • 手动创建D:\LimsDeploy\logs目录

  • 检查该目录是否有写入权限

3.使用绝对路径启动(推荐)

bat

REM 方案1:先切换目录再启动 cd /d D:\LimsDeploy\lims-server start "lims-server" javaw -jar lims-server-1.0-SNAPSHOT.jar --server.port=8085 REM 方案2:在start命令中指定工作目录 start "lims-server" /D "D:\LimsDeploy\lims-server" javaw -jar lims-server-1.0-SNAPSHOT.jar --server.port=8085

4.调试建议

方案A:添加调试信息查看当前目录
在Spring Boot启动类中添加:

java

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import javax.annotation.PostConstruct; import java.io.File; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @PostConstruct public void init() { System.out.println("当前工作目录: " + System.getProperty("user.dir")); System.out.println("日志文件路径: " + new File("logs/lims-server.log").getAbsolutePath()); } }

方案B:临时改用控制台可见的方式运行

bat

REM 去掉javaw和start,直接运行查看日志 cd /d D:\LimsDeploy\lims-server java -jar lims-server-1.0-SNAPSHOT.jar --server.port=8085

方案C:检查日志配置是否生效
application.yml中添加完整配置:

yaml

logging: level: root: INFO org.springframework.web: INFO file: name: D:/LimsDeploy/logs/lims-server.log # 绝对路径 pattern: console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" logback: rollingpolicy: max-file-size: 10MB max-history: 300 total-size-cap: 10GB

5.快速验证脚本

创建一个run.bat文件:

bat

@echo off echo 当前目录: %cd% echo 正在启动应用... REM 确保日志目录存在 if not exist "logs" mkdir logs REM 切换到jar包所在目录 cd /d D:\LimsDeploy\lims-server echo 工作目录已切换到: %cd% echo 日志将生成在: %cd%\logs\lims-server.log REM 启动应用 start "lims-server" javaw -jar lims-server-1.0-SNAPSHOT.jar --server.port=8085 echo 应用已启动,请检查日志文件 pause

最可能的解决方案:

直接将您的启动命令改为:

bat

cd /d D:\LimsDeploy\lims-server start "lims-server" javaw -jar lims-server-1.0-SNAPSHOT.jar --server.port=8085

或者在配置文件中使用绝对路径:

yaml

logging: file: name: D:/LimsDeploy/lims-server/logs/lims-server.log

请尝试上述方案,通常相对路径问题是最常见的原因。


start "lims-server" javaw -jar D:\LimsDeploy\lims-server\lims-server-1.0-SNAPSHOT.jar --server.port=8085 我不是已经指定绝对路径了吗?

您说得对,您确实在启动命令中指定了jar包的绝对路径,但这里有个关键区别需要理解:

核心问题:工作目录 vs 可执行文件路径

当您使用start "lims-server" javaw -jar D:\LimsDeploy\lims-server\lims-server-1.0-SNAPSHOT.jar时:

  1. jar包的路径是绝对路径- 没错

  2. 但工作目录(Current Working Directory)没有指定- 这是问题所在

  3. 日志文件路径logs/lims-server.log是相对路径,它相对于工作目录,而不是jar包所在目录

实际发生的情况:

text

# 假设您在 C:\Users\YourName 目录下执行命令 当前工作目录: C:\Users\YourName # 您的命令 start "lims-server" javaw -jar D:\LimsDeploy\lims-server\lims-server-1.0-SNAPSHOT.jar # 结果: # 1. Java进程从 D:\LimsDeploy\lims-server\lims-server-1.0-SNAPSHOT.jar 启动 # 2. 但工作目录仍是 C:\Users\YourName # 3. 日志文件将创建在:C:\Users\YourName\logs\lims-server.log

验证方法:

方法1:查看日志文件可能在哪里
在命令提示符中运行:

batch

echo %cd%

查看当前目录,然后去这个目录的logs子文件夹中找。

方法2:使用PowerShell查找日志文件

powershell

# 在整个D盘搜索日志文件 Get-ChildItem -Path D:\ -Filter "lims-server.log" -Recurse -ErrorAction SilentlyContinue # 或者在C盘搜索 Get-ChildItem -Path C:\ -Filter "lims-server.log" -Recurse -ErrorAction SilentlyContinue -Depth 3

解决方案(任选其一):

方案1:指定工作目录(推荐)

batch

start "lims-server" /D "D:\LimsDeploy\lims-server" javaw -jar lims-server-1.0-SNAPSHOT.jar --server.port=8085

注意:这里jar包路径改为了相对路径(因为工作目录已经切换到jar所在目录)。

方案2:先切换目录再启动

batch

cd /d D:\LimsDeploy\lims-server start "lims-server" javaw -jar lims-server-1.0-SNAPSHOT.jar --server.port=8085

方案3:在配置文件中使用绝对路径

yaml

logging: file: name: D:/LimsDeploy/lims-server/logs/lims-server.log # 绝对路径

方案4:修改启动脚本,显式设置工作目录

batch

@echo off REM 保存为 run.bat REM 切换到jar包目录 pushd D:\LimsDeploy\lims-server REM 启动应用 start "lims-server" javaw -jar lims-server-1.0-SNAPSHOT.jar --server.port=8085 REM 返回原目录 popd

快速测试命令:

要立即验证,可以运行这个命令查看当前工作目录:

batch

start "test" javaw -version

然后在任务管理器中找到javaw.exe进程,右键查看"属性",可以看到"起始位置"(工作目录)。

总结:

根本原因:您指定了jar包的绝对路径,但日志文件的相对路径logs/lims-server.log是相对于进程启动时的工作目录,而这个工作目录默认是执行start命令时的当前目录,不是jar包所在目录。

最简单的修复:使用/D参数指定工作目录:

batch

start "lims-server" /D "D:\LimsDeploy\lims-server" javaw -jar lims-server-1.0-SNAPSHOT.jar --server.port=8085

这样,日志文件就会生成在D:\LimsDeploy\lims-server\logs\lims-server.log


终于找到我的日志文件了!

Get-ChildItem -Path C:\ -Filter "lims-server.log" -Recurse -ErrorAction SilentlyContinue -Depth 3

修改后,运行脚本,果然日志就出来了


那这条命令又如何修改指定工作目录呢? start "lims-server" javaw -Djdk.tls.client.protocols=TLSv1 -Djsse.enableSNIExtension=false -Djdk.tls.allowUnsafeServerCertChange=true -jar D:\LimsDeploy\lims-server\lims-server-1.0-SNAPSHOT.jar --server.port=8085

您可以在start命令中使用/D参数来指定工作目录,修改后的命令如下:

修改后的命令:

batch

start "lims-server" /D "D:\LimsDeploy\lims-server" javaw -Djdk.tls.client.protocols=TLSv1 -Djsse.enableSNIExtension=false -Djdk.tls.allowUnsafeServerCertChange=true -jar lims-server-1.0-SNAPSHOT.jar --server.port=8085

说明:

  1. 添加了/D "D:\LimsDeploy\lims-server"

    • 这个参数指定了Java进程的工作目录

    • 工作目录会被设置为D:\LimsDeploy\lims-server

  2. 简化了jar包路径

    • 因为工作目录已经切换到jar包所在目录,所以可以使用相对路径lims-server-1.0-SNAPSHOT.jar

    • 当然,您也可以继续使用绝对路径:

batch

start "lims-server" /D "D:\LimsDeploy\lims-server" javaw -Djdk.tls.client.protocols=TLSv1 -Djsse.enableSNIExtension=false -Djdk.tls.allowUnsafeServerCertChange=true -jar D:\LimsDeploy\lims-server\lims-server-1.0-SNAPSHOT.jar --server.port=8085

完整命令结构说明:

text

start "窗口标题" /D "工作目录路径" 可执行文件 [参数...]

应用到您的命令:

  • "lims-server"- 窗口标题(对javaw无窗口应用来说只是个标识)

  • /D "D:\LimsDeploy\lims-server"- 指定工作目录

  • javaw- 可执行程序

  • -Djdk.tls.client.protocols=TLSv1 ...- JVM参数

  • -jar lims-server-1.0-SNAPSHOT.jar- 运行jar包

  • --server.port=8085- Spring Boot应用参数

创建批处理文件(推荐)

为了避免每次手动输入长命令,建议创建一个批处理文件start-lims.bat

batch

@echo off echo 正在启动LIMS服务器... echo 工作目录: D:\LimsDeploy\lims-server echo 日志文件: D:\LimsDeploy\lims-server\logs\lims-server.log start "lims-server" /D "D:\LimsDeploy\lims-server" javaw ^ -Djdk.tls.client.protocols=TLSv1 ^ -Djsse.enableSNIExtension=false ^ -Djdk.tls.allowUnsafeServerCertChange=true ^ -jar lims-server-1.0-SNAPSHOT.jar ^ --server.port=8085 echo 应用已启动,请检查日志文件 pause

验证工作目录是否生效

您可以在Spring Boot应用中添加一个简单的验证:

java

import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import java.io.File; @Component public class StartupCheck implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("当前工作目录: " + new File(".").getAbsolutePath()); System.out.println("期望日志路径: " + new File("logs/lims-server.log").getAbsolutePath()); } }

备选方案:设置日志绝对路径

如果您不想修改启动命令,也可以在application.yml中配置绝对路径:

yaml

logging: file: name: D:/LimsDeploy/lims-server/logs/lims-server.log

这样无论工作目录是什么,日志都会生成在指定位置。

最终建议:

使用这个修改后的命令,日志文件就会生成在正确的位置:

batch

start "lims-server" /D "D:\LimsDeploy\lims-server" javaw -Djdk.tls.client.protocols=TLSv1 -Djsse.enableSNIExtension=false -Djdk.tls.allowUnsafeServerCertChange=true -jar lims-server-1.0-SNAPSHOT.jar --server.port=8085

那这条命令又如何修改指定工作目录? :: 使用 JVM 参数运行应用(多行排版) :: 1、使用 ^ 符号将长命令分解为多行,提高易读性 :: 2、增加防御性编程,路径使用引号包裹,避免空格或特殊字符问题 start "lims-server" javaw ^ -Djdk.tls.client.protocols=TLSv1 ^ -Djsse.enableSNIExtension=false ^ -Djdk.tls.allowUnsafeServerCertChange=true ^ -jar "D:\LimsDeploy\lims-server\lims-server-1.0-SNAPSHOT.jar" ^ --server.port=8085

修改后的命令:

batch

:: 使用 JVM 参数运行应用(多行排版) :: 1、使用 ^ 符号将长命令分解为多行,提高易读性 :: 2、增加防御性编程,路径使用引号包裹,避免空格或特殊字符问题 start "lims-server" /D "D:\LimsDeploy\lims-server" javaw ^ -Djdk.tls.client.protocols=TLSv1 ^ -Djsse.enableSNIExtension=false ^ -Djdk.tls.allowUnsafeServerCertChange=true ^ -jar "lims-server-1.0-SNAPSHOT.jar" ^ --server.port=8085

关键修改点:

  1. 添加了/D "D:\LimsDeploy\lims-server"

    • "lims-server"窗口标题之后

    • javaw命令之前

  2. 简化了jar包路径

    • 由于工作目录已经切换到D:\LimsDeploy\lims-server

    • jar包路径可以改为相对路径"lims-server-1.0-SNAPSHOT.jar"

如果仍想使用绝对路径:

batch

:: 使用 JVM 参数运行应用(多行排版) :: 1、使用 ^ 符号将长命令分解为多行,提高易读性 :: 2、增加防御性编程,路径使用引号包裹,避免空格或特殊字符问题 start "lims-server" /D "D:\LimsDeploy\lims-server" javaw ^ -Djdk.tls.client.protocols=TLSv1 ^ -Djsse.enableSNIExtension=false ^ -Djdk.tls.allowUnsafeServerCertChange=true ^ -jar "D:\LimsDeploy\lims-server\lims-server-1.0-SNAPSHOT.jar" ^ --server.port=8085

最佳实践:创建批处理文件

建议创建一个专门的启动脚本start-server.bat

batch

@echo off chcp 65001 > nul echo ======================================== echo LIMS Server 启动脚本 echo ======================================== echo. REM 设置工作目录和JAR路径 set WORK_DIR=D:\LimsDeploy\lims-server set JAR_NAME=lims-server-1.0-SNAPSHOT.jar set PORT=8085 REM 检查JAR文件是否存在 if not exist "%WORK_DIR%\%JAR_NAME%" ( echo [错误] 未找到JAR文件: %WORK_DIR%\%JAR_NAME% pause exit /b 1 ) REM 检查是否已存在该进程 tasklist /FI "WINDOWTITLE eq lims-server*" 2>nul | find /I "javaw.exe" >nul if not errorlevel 1 ( echo [警告] 检测到LIMS Server已在运行 echo 是否要强制重启?(Y/N) set /p choice= if /i "%choice%"=="Y" ( echo 正在停止现有进程... taskkill /FI "WINDOWTITLE eq lims-server*" /F >nul 2>&1 timeout /t 3 /nobreak >nul ) else ( echo 启动已取消 pause exit /b 0 ) ) REM 确保日志目录存在 if not exist "%WORK_DIR%\logs" mkdir "%WORK_DIR%\logs" echo [信息] 工作目录: %WORK_DIR% echo [信息] JAR文件: %JAR_NAME% echo [信息] 服务端口: %PORT% echo [信息] 日志文件: %WORK_DIR%\logs\lims-server.log echo. REM 启动服务 echo 正在启动LIMS Server... start "lims-server" /D "%WORK_DIR%" javaw ^ -Djdk.tls.client.protocols=TLSv1 ^ -Djsse.enableSNIExtension=false ^ -Djdk.tls.allowUnsafeServerCertChange=true ^ -jar "%JAR_NAME%" ^ --server.port=%PORT% echo. echo ======================================== echo LIMS Server 启动成功! echo 请检查日志文件: echo %WORK_DIR%\logs\lims-server.log echo ======================================== echo. echo 按任意键退出此窗口... pause >nul

命令结构说明:

text

start "窗口标题" /D "工作目录" 可执行程序 [参数]

在您的多行排版命令中:

  • start- 启动新进程的命令

  • "lims-server"- 进程窗口的标题

  • /D "D:\LimsDeploy\lims-server"- 指定工作目录

  • javaw- Java无控制台窗口版本

  • -D...- JVM系统属性参数

  • -jar "lims-server-1.0-SNAPSHOT.jar"- 要运行的jar文件

  • --server.port=8085- Spring Boot应用参数

验证修改是否生效:

您可以在Spring Boot应用中添加以下代码来验证工作目录:

java

import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; import java.io.File; @Component public class WorkDirChecker implements ApplicationRunner { @Override public void run(ApplicationArguments args) { File currentDir = new File("."); File logFile = new File("logs/lims-server.log"); System.out.println("========== 工作目录检查 =========="); System.out.println("当前工作目录: " + currentDir.getAbsolutePath()); System.out.println("期望的日志文件路径: " + logFile.getAbsolutePath()); System.out.println("工作目录是否存在: " + currentDir.exists()); System.out.println("日志文件是否存在: " + logFile.exists()); System.out.println("================================="); } }

使用修改后的命令,日志文件一定会生成在D:\LimsDeploy\lims-server\logs\lims-server.log


请参考这个: 建议创建一个专门的启动脚本 start-server.bat: batch @echo off chcp 65001 > nul echo ======================================== echo LIMS Server 启动脚本 echo ======================================== echo. REM 设置工作目录和JAR路径 set WORK_DIR=D:\LimsDeploy\lims-server set JAR_NAME=lims-server-1.0-SNAPSHOT.jar set PORT=8085 REM 检查JAR文件是否存在 if not exist "%WORK_DIR%\%JAR_NAME%" ( echo [错误] 未找到JAR文件: %WORK_DIR%\%JAR_NAME% pause exit /b 1 ) REM 检查是否已存在该进程 tasklist /FI "WINDOWTITLE eq lims-server*" 2>nul | find /I "javaw.exe" >nul if not errorlevel 1 ( echo [警告] 检测到LIMS Server已在运行 echo 是否要强制重启?(Y/N) set /p choice= if /i "%choice%"=="Y" ( echo 正在停止现有进程... taskkill /FI "WINDOWTITLE eq lims-server*" /F >nul 2>&1 timeout /t 3 /nobreak >nul ) else ( echo 启动已取消 pause exit /b 0 ) ) REM 确保日志目录存在 if not exist "%WORK_DIR%\logs" mkdir "%WORK_DIR%\logs" echo [信息] 工作目录: %WORK_DIR% echo [信息] JAR文件: %JAR_NAME% echo [信息] 服务端口: %PORT% echo [信息] 日志文件: %WORK_DIR%\logs\lims-server.log echo. REM 启动服务 echo 正在启动LIMS Server... start "lims-server" /D "%WORK_DIR%" javaw ^ -Djdk.tls.client.protocols=TLSv1 ^ -Djsse.enableSNIExtension=false ^ -Djdk.tls.allowUnsafeServerCertChange=true ^ -jar "%JAR_NAME%" ^ --server.port=%PORT% echo. echo ======================================== echo LIMS Server 启动成功! echo 请检查日志文件: echo %WORK_DIR%\logs\lims-server.log echo ======================================== echo. echo 按任意键退出此窗口... pause >nul 重构编写一个.cmd的命令行脚本文件

LIMS Server 启动脚本 (start-server.cmd)

cmd

@echo off chcp 65001 > nul title LIMS Server 启动管理 echo ======================================== echo LIMS Server 启动脚本 v1.0 echo ======================================== echo. REM *************************** REM * 配置参数区 - 请根据需要修改 * REM *************************** set "WORK_DIR=D:\LimsDeploy\lims-server" set "JAR_NAME=lims-server-1.0-SNAPSHOT.jar" set "PORT=8085" set "APP_TITLE=lims-server" set "LOG_DIR=logs" set "LOG_FILE=%WORK_DIR%\%LOG_DIR%\lims-server.log" REM *************************** REM * JVM 参数配置 * REM *************************** set "JVM_OPTS=-Djdk.tls.client.protocols=TLSv1 -Djsse.enableSNIExtension=false -Djdk.tls.allowUnsafeServerCertChange=true" set "APP_OPTS=--server.port=%PORT%" REM *************************** REM * 检查环境 * REM *************************** :CHECK_ENV echo [1/5] 检查运行环境... REM 检查Java是否安装 where java >nul 2>&1 if %errorlevel% neq 0 ( echo [错误] 未检测到Java环境,请先安装JDK! pause exit /b 1 ) echo [√] Java环境检测通过 REM 检查JAR文件是否存在 if not exist "%WORK_DIR%\%JAR_NAME%" ( echo [错误] 未找到JAR文件: echo %WORK_DIR%\%JAR_NAME% pause exit /b 1 ) echo [√] JAR文件检测通过 REM *************************** REM * 检查进程状态 * REM *************************** :CHECK_PROCESS echo [2/5] 检查进程状态... set "PROCESS_RUNNING=0" for /f "tokens=2 delims=," %%a in ('tasklist /fi "imagename eq javaw.exe" /fo csv /nh 2^>nul') do ( for /f "tokens=1 delims=," %%b in ('wmic process where "processid='%%~a'" get commandline /value 2^>nul ^| findstr /i "%JAR_NAME%"') do ( set "PROCESS_RUNNING=1" ) ) if %PROCESS_RUNNING% equ 1 ( echo [警告] 检测到LIMS Server已在运行 echo. echo 请选择操作: echo 1. 强制重启服务 echo 2. 仅启动新实例 echo 3. 退出脚本 echo. set /p "CHOICE=请输入选项 (1/2/3): " if "%CHOICE%"=="1" ( echo 正在停止现有进程... for /f "tokens=2 delims=," %%a in ('tasklist /fi "imagename eq javaw.exe" /fo csv /nh 2^>nul') do ( for /f "tokens=1 delims=," %%b in ('wmic process where "processid='%%~a'" get commandline /value 2^>nul ^| findstr /i "%JAR_NAME%"') do ( taskkill /pid %%a /f >nul 2>&1 echo 已停止进程 PID: %%a ) ) timeout /t 2 /nobreak >nul goto :PREPARE_START ) else if "%CHOICE%"=="2" ( echo 启动新实例... goto :PREPARE_START ) else ( echo 启动已取消 pause exit /b 0 ) ) else ( echo [√] 未检测到运行中的实例 ) :PREPARE_START REM *************************** REM * 准备启动 * REM *************************** echo [3/5] 准备启动环境... REM 确保工作目录存在 if not exist "%WORK_DIR%" ( echo [信息] 创建工作目录: %WORK_DIR% mkdir "%WORK_DIR%" ) REM 确保日志目录存在 if not exist "%WORK_DIR%\%LOG_DIR%" ( echo [信息] 创建日志目录: %WORK_DIR%\%LOG_DIR% mkdir "%WORK_DIR%\%LOG_DIR%" ) REM 显示配置信息 echo [4/5] 显示启动配置... echo. echo 工作目录: %WORK_DIR% echo JAR文件: %JAR_NAME% echo 服务端口: %PORT% echo 日志文件: %LOG_FILE% echo JVM参数: %JVM_OPTS% echo. echo [注意] 日志文件将在首次日志输出后创建 echo. REM *************************** REM * 启动服务 * REM *************************** echo [5/5] 正在启动LIMS Server... echo. REM 切换到工作目录 pushd "%WORK_DIR%" REM 启动服务 (使用多行排版提高可读性) start "%APP_TITLE%" /D "%WORK_DIR%" javaw ^ %JVM_OPTS% ^ -jar "%JAR_NAME%" ^ %APP_OPTS% REM 返回原始目录 popd REM *************************** REM * 启动后处理 * REM *************************** echo. echo ======================================== echo LIMS Server 启动命令已执行! echo ======================================== echo. echo [启动信息] echo • 进程标题: %APP_TITLE% echo • 启动时间: %date% %time% echo • 工作目录: %WORK_DIR% echo • 日志路径: %LOG_FILE% echo. echo [操作指南] echo • 查看进程: tasklist | findstr javaw echo • 查看日志: type "%LOG_FILE%" | more echo • 实时日志: tail -f "%LOG_FILE%" echo. echo [注意事项] echo 1. 首次启动时,日志文件将在首次日志输出后创建 echo 2. 如启动失败,请检查JAR文件是否完整 echo 3. 如需修改配置,请编辑本脚本文件 echo. REM 等待用户查看信息 choice /c YN /n /m "是否现在打开日志目录? (Y/N): " if %errorlevel% equ 1 ( if exist "%WORK_DIR%\%LOG_DIR%" ( explorer "%WORK_DIR%\%LOG_DIR%" ) ) echo. echo 按任意键退出... pause >nul exit /b 0 REM *************************** REM * 脚本结束 * REM ***************************

配套工具脚本 (辅助功能)

您也可以创建一个单独的辅助脚本lims-tools.cmd

cmd

@echo off chcp 65001 > nul title LIMS Server 工具集 :MAIN_MENU cls echo ======================================== echo LIMS Server 管理工具集 v1.0 echo ======================================== echo. echo 请选择操作: echo 1. 启动服务器 echo 2. 停止服务器 echo 3. 查看服务器状态 echo 4. 查看实时日志 echo 5. 查看日志目录 echo 6. 清理旧日志 echo 7. 备份日志 echo 8. 退出 echo. set /p "CHOICE=请选择 (1-8): " if "%CHOICE%"=="1" ( call start-server.cmd goto :MAIN_MENU ) else if "%CHOICE%"=="2" ( call :STOP_SERVER goto :MAIN_MENU ) else if "%CHOICE%"=="3" ( call :CHECK_STATUS goto :MAIN_MENU ) else if "%CHOICE%"=="4" ( call :VIEW_LOG goto :MAIN_MENU ) else if "%CHOICE%"=="5" ( call :OPEN_LOG_DIR goto :MAIN_MENU ) else if "%CHOICE%"=="6" ( call :CLEAN_LOGS goto :MAIN_MENU ) else if "%CHOICE%"=="7" ( call :BACKUP_LOGS goto :MAIN_MENU ) else if "%CHOICE%"=="8" ( exit /b 0 ) else ( echo 无效选择,请重新输入! timeout /t 2 /nobreak >nul goto :MAIN_MENU ) :STOP_SERVER echo. echo [停止服务器] set "JAR_NAME=lims-server-1.0-SNAPSHOT.jar" set "FOUND=0" for /f "tokens=2 delims=," %%a in ('tasklist /fi "imagename eq javaw.exe" /fo csv /nh 2^>nul') do ( for /f "tokens=1 delims=," %%b in ('wmic process where "processid='%%~a'" get commandline /value 2^>nul ^| findstr /i "%JAR_NAME%"') do ( echo 找到进程 PID: %%a set "FOUND=1" taskkill /pid %%a /f >nul 2>&1 if errorlevel 1 ( echo 停止进程失败: %%a ) else ( echo 成功停止进程: %%a ) ) ) if %FOUND% equ 0 ( echo 未找到运行的LIMS Server进程 ) timeout /t 2 /nobreak >nul exit /b :CHECK_STATUS echo. echo [服务器状态] set "JAR_NAME=lims-server-1.0-SNAPSHOT.jar" set "FOUND=0" for /f "tokens=2 delims=," %%a in ('tasklist /fi "imagename eq javaw.exe" /fo csv /nh 2^>nul') do ( for /f "tokens=1 delims=," %%b in ('wmic process where "processid='%%~a'" get commandline /value 2^>nul ^| findstr /i "%JAR_NAME%"') do ( echo [运行中] PID: %%a wmic process where "processid='%%a'" get CommandLine /value | findstr /v "^$" echo. set "FOUND=1" ) ) if %FOUND% equ 0 ( echo [已停止] 未检测到运行中的LIMS Server ) echo 按任意键继续... pause >nul exit /b :VIEW_LOG echo. echo [查看实时日志 - 按 Ctrl+C 退出] set "LOG_FILE=D:\LimsDeploy\lims-server\logs\lims-server.log" if not exist "%LOG_FILE%" ( echo 日志文件不存在: %LOG_FILE% echo 请确认服务器已启动并产生日志输出 pause exit /b ) echo 正在监视日志文件: %LOG_FILE% echo. timeout /t 1 /nobreak >nul REM 使用 PowerShell 实现 tail -f 功能 powershell -Command "Get-Content '%LOG_FILE%' -Wait -Tail 50" exit /b :OPEN_LOG_DIR echo. echo [打开日志目录] set "LOG_DIR=D:\LimsDeploy\lims-server\logs" if exist "%LOG_DIR%" ( explorer "%LOG_DIR%" ) else ( echo 日志目录不存在: %LOG_DIR% pause ) exit /b :CLEAN_LOGS echo. echo [清理旧日志] set "LOG_DIR=D:\LimsDeploy\lims-server\logs" if not exist "%LOG_DIR%" ( echo 日志目录不存在: %LOG_DIR% pause exit /b ) echo 将删除30天前的日志文件 echo 按任意键继续,或按 Ctrl+C 取消... pause >nul forfiles /p "%LOG_DIR%" /s /m *.log /d -30 /c "cmd /c echo 删除 @file && del @file" forfiles /p "%LOG_DIR%" /s /m *.gz /d -30 /c "cmd /c echo 删除 @file && del @file" forfiles /p "%LOG_DIR%" /s /m *.zip /d -30 /c "cmd /c echo 删除 @file && del @file" echo 清理完成! timeout /t 2 /nobreak >nul exit /b :BACKUP_LOGS echo. echo [备份日志] set "LOG_DIR=D:\LimsDeploy\lims-server\logs" set "BACKUP_DIR=D:\LimsDeploy\backup" set "BACKUP_NAME=logs_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%.zip" if not exist "%LOG_DIR%" ( echo 日志目录不存在: %LOG_DIR% pause exit /b ) if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%" echo 正在备份日志到: %BACKUP_DIR%\%BACKUP_NAME% REM 使用 PowerShell 创建 ZIP 压缩包 powershell -Command "Compress-Archive -Path '%LOG_DIR%\*' -DestinationPath '%BACKUP_DIR%\%BACKUP_NAME%' -Force" if exist "%BACKUP_DIR%\%BACKUP_NAME%" ( echo 备份成功: %BACKUP_DIR%\%BACKUP_NAME% ) else ( echo 备份失败! ) pause exit /b

使用说明

1. 主启动脚本 (start-server.cmd)

  • 提供完整的启动流程

  • 智能检测进程状态

  • 清晰的配置信息显示

  • 灵活的进程管理选项

2. 工具集脚本 (lims-tools.cmd)

  • 提供完整的服务器管理功能

  • 支持启动、停止、状态检查

  • 提供日志查看和清理功能

  • 包含日志备份功能

3. 部署步骤

  1. 将两个脚本文件保存到D:\LimsDeploy\目录

  2. 根据需要修改脚本中的配置参数

  3. 运行start-server.cmd启动服务

  4. 或运行lims-tools.cmd使用完整管理功能

4. 配置项说明

  • WORK_DIR: 工作目录 (jar包所在目录)

  • JAR_NAME: jar包文件名

  • PORT: 服务端口

  • APP_TITLE: 进程窗口标题

  • LOG_DIR: 日志目录名称

  • JVM_OPTS: JVM启动参数

  • APP_OPTS: 应用启动参数

这个.cmd脚本提供了比原.bat脚本更完善的错误处理、进程管理和用户交互功能。


请把最后这个.cmd脚本方案,重构一个适用于Linux环境的脚本

Linux 环境下的 LIMS Server 管理脚本

1. 主启动脚本 (start-server.sh)

bash

#!/bin/bash # ======================================== # LIMS Server 启动脚本 v1.0 (Linux版本) # ======================================== # 定义颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 打印彩色消息函数 print_info() { echo -e "${BLUE}[信息]${NC} $1"; } print_success() { echo -e "${GREEN}[成功]${NC} $1"; } print_warning() { echo -e "${YELLOW}[警告]${NC} $1"; } print_error() { echo -e "${RED}[错误]${NC} $1"; } # 配置参数 WORK_DIR="/opt/lims-server" JAR_NAME="lims-server-1.0-SNAPSHOT.jar" PORT="8085" APP_NAME="lims-server" LOG_DIR="logs" LOG_FILE="${WORK_DIR}/${LOG_DIR}/lims-server.log" PID_FILE="${WORK_DIR}/${APP_NAME}.pid" CONSOLE_LOG="${WORK_DIR}/${LOG_DIR}/console.log" # JVM 参数 JVM_OPTS="-Djdk.tls.client.protocols=TLSv1 -Djsse.enableSNIExtension=false -Djdk.tls.allowUnsafeServerCertChange=true" APP_OPTS="--server.port=${PORT}" # 检查运行环境 check_environment() { print_info "检查运行环境..." # 检查Java是否安装 if ! command -v java &> /dev/null; then print_error "未检测到Java环境,请先安装JDK!" exit 1 fi print_success "Java环境检测通过" # 检查JAR文件是否存在 if [ ! -f "${WORK_DIR}/${JAR_NAME}" ]; then print_error "未找到JAR文件: ${WORK_DIR}/${JAR_NAME}" exit 1 fi print_success "JAR文件检测通过" } # 检查进程状态 check_process() { if [ -f "${PID_FILE}" ]; then local pid=$(cat "${PID_FILE}") if ps -p ${pid} > /dev/null 2>&1; then return 0 # 进程正在运行 else # 进程文件存在但进程不存在,清理pid文件 rm -f "${PID_FILE}" return 1 fi fi return 1 # 进程未运行 } # 停止进程 stop_process() { if [ -f "${PID_FILE}" ]; then local pid=$(cat "${PID_FILE}") print_info "正在停止进程 (PID: ${pid})..." # 发送SIGTERM信号 kill -15 ${pid} 2>/dev/null # 等待最多10秒 local count=0 while [ ${count} -lt 10 ]; do if ps -p ${pid} > /dev/null 2>&1; then sleep 1 count=$((count + 1)) else rm -f "${PID_FILE}" print_success "进程已停止" return 0 fi done # 强制终止 kill -9 ${pid} 2>/dev/null rm -f "${PID_FILE}" print_warning "进程已强制终止" fi return 0 } # 准备启动环境 prepare_environment() { print_info "准备启动环境..." # 创建工作目录 if [ ! -d "${WORK_DIR}" ]; then mkdir -p "${WORK_DIR}" print_info "创建工作目录: ${WORK_DIR}" fi # 创建日志目录 if [ ! -d "${WORK_DIR}/${LOG_DIR}" ]; then mkdir -p "${WORK_DIR}/${LOG_DIR}" print_info "创建日志目录: ${WORK_DIR}/${LOG_DIR}" fi } # 显示配置信息 show_config() { print_info "显示启动配置..." echo "" echo " 工作目录: ${WORK_DIR}" echo " JAR文件: ${JAR_NAME}" echo " 服务端口: ${PORT}" echo " 应用名称: ${APP_NAME}" echo " 日志文件: ${LOG_FILE}" echo " PID文件: ${PID_FILE}" echo " JVM参数: ${JVM_OPTS}" echo "" } # 启动服务 start_service() { print_info "正在启动LIMS Server..." # 切换到工作目录 cd "${WORK_DIR}" # 启动服务(后台运行) nohup java ${JVM_OPTS} -jar ${JAR_NAME} ${APP_OPTS} >> "${CONSOLE_LOG}" 2>&1 & # 保存进程ID local pid=$! echo ${pid} > "${PID_FILE}" # 等待进程启动 print_info "等待服务启动..." sleep 5 # 检查进程是否仍在运行 if ps -p ${pid} > /dev/null 2>&1; then print_success "服务启动成功 (PID: ${pid})" else print_error "服务启动失败,请检查日志" rm -f "${PID_FILE}" exit 1 fi } # 检查服务状态 check_service_status() { if check_process; then local pid=$(cat "${PID_FILE}") print_success "服务正在运行 (PID: ${pid})" return 0 else print_warning "服务未运行" return 1 fi } # 显示启动信息 show_startup_info() { echo "" echo "========================================" echo " LIMS Server 启动完成!" echo "========================================" echo "" echo "启动信息:" echo " • 进程ID: $(cat ${PID_FILE} 2>/dev/null || echo 'N/A')" echo " • 启动时间: $(date '+%Y-%m-%d %H:%M:%S')" echo " • 工作目录: ${WORK_DIR}" echo " • 服务端口: ${PORT}" echo " • 日志文件: ${LOG_FILE}" echo "" echo "操作命令:" echo " • 查看状态: $0 status" echo " • 停止服务: $0 stop" echo " • 查看日志: $0 log" echo " • 重启服务: $0 restart" echo "" } # 主函数 main() { # 显示标题 echo -e "${BLUE}========================================${NC}" echo -e "${BLUE} LIMS Server 启动脚本 v1.0${NC}" echo -e "${BLUE} Linux 版本${NC}" echo -e "${BLUE}========================================${NC}" echo "" # 检查参数 case "${1}" in "start") check_environment if check_process; then local pid=$(cat "${PID_FILE}") print_warning "检测到服务已在运行 (PID: ${pid})" read -p "是否重启服务? (y/n): " choice if [[ "${choice}" =~ ^[Yy]$ ]]; then stop_process prepare_environment show_config start_service show_startup_info else print_info "操作已取消" fi else prepare_environment show_config start_service show_startup_info fi ;; "stop") if check_process; then stop_process else print_warning "服务未运行" fi ;; "restart") check_environment stop_process prepare_environment show_config start_service show_startup_info ;; "status") check_service_status ;; "log") if [ -f "${LOG_FILE}" ]; then print_info "显示日志 (按Ctrl+C退出):" echo "" tail -f "${LOG_FILE}" else print_error "日志文件不存在: ${LOG_FILE}" fi ;; "console") if [ -f "${CONSOLE_LOG}" ]; then print_info "显示控制台日志:" echo "" tail -100 "${CONSOLE_LOG}" else print_error "控制台日志文件不存在: ${CONSOLE_LOG}" fi ;; "clean") read -p "确定要清理所有日志文件吗? (y/n): " choice if [[ "${choice}" =~ ^[Yy]$ ]]; then rm -f "${WORK_DIR}/${LOG_DIR}"/*.log rm -f "${WORK_DIR}/${LOG_DIR}"/*.gz print_success "日志文件已清理" else print_info "操作已取消" fi ;; *) echo "使用方法: $0 {start|stop|restart|status|log|console|clean}" echo "" echo "命令说明:" echo " start 启动服务" echo " stop 停止服务" echo " restart 重启服务" echo " status 查看服务状态" echo " log 实时查看日志" echo " console 查看控制台输出" echo " clean 清理日志文件" echo "" exit 1 ;; esac } # 执行主函数 main "$@"

2. 系统服务配置 (lims-server.service)

ini

# /etc/systemd/system/lims-server.service [Unit] Description=LIMS Server Application After=network.target [Service] Type=simple User=limsuser Group=limsgroup WorkingDirectory=/opt/lims-server ExecStart=/usr/bin/java -Djdk.tls.client.protocols=TLSv1 -Djsse.enableSNIExtension=false -Djdk.tls.allowUnsafeServerCertChange=true -jar /opt/lims-server/lims-server-1.0-SNAPSHOT.jar --server.port=8085 SuccessExitStatus=143 Restart=always RestartSec=10 StandardOutput=append:/opt/lims-server/logs/console.log StandardError=append:/opt/lims-server/logs/error.log # 日志配置 SyslogIdentifier=lims-server SyslogFacility=local7 # 资源限制 LimitNOFILE=65536 LimitNPROC=4096 [Install] WantedBy=multi-user.target

3. 管理工具脚本 (lims-tools.sh)

bash

#!/bin/bash # ======================================== # LIMS Server 管理工具集 (Linux版本) # ======================================== # 定义颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 配置参数 WORK_DIR="/opt/lims-server" LOG_DIR="${WORK_DIR}/logs" BACKUP_DIR="/opt/lims-backup" # 显示菜单 show_menu() { clear echo -e "${BLUE}========================================${NC}" echo -e "${BLUE} LIMS Server 管理工具集 v1.0${NC}" echo -e "${BLUE} Linux 版本${NC}" echo -e "${BLUE}========================================${NC}" echo "" echo " 请选择操作:" echo " 1. 启动服务器" echo " 2. 停止服务器" echo " 3. 重启服务器" echo " 4. 查看服务器状态" echo " 5. 查看实时日志" echo " 6. 查看控制台输出" echo " 7. 查看日志目录" echo " 8. 清理旧日志" echo " 9. 备份日志" echo " 10. 系统资源监控" echo " 11. JVM 监控" echo " 0. 退出" echo "" } # 检查服务状态 check_status() { echo -e "${BLUE}[检查服务状态]${NC}" echo "" # 检查进程 if pgrep -f "lims-server.*jar" > /dev/null; then local pid=$(pgrep -f "lims-server.*jar") echo -e "${GREEN}[运行中]${NC} 进程ID: ${pid}" # 显示进程详细信息 echo "" echo "进程信息:" ps -fp ${pid} | tail -1 # 显示端口占用 echo "" echo "端口占用:" netstat -tlnp 2>/dev/null | grep :8085 || echo "端口 8085 未监听" # 显示内存使用 echo "" echo "内存使用:" if command -v jstat &> /dev/null && [ -f /proc/${pid}/exe ]; then jstat -gc ${pid} 2>/dev/null || echo "无法获取JVM统计信息" fi else echo -e "${RED}[已停止]${NC} 未检测到运行中的LIMS Server" fi echo "" read -p "按任意键继续..." -n1 -s echo "" } # 查看实时日志 view_log() { echo -e "${BLUE}[查看实时日志]${NC}" echo "" local log_file="${LOG_DIR}/lims-server.log" if [ -f "${log_file}" ]; then echo "正在监视日志文件: ${log_file}" echo "按 Ctrl+C 退出" echo "" # 显示最后50行,然后开始实时监控 tail -50 "${log_file}" echo "" echo "========================================" echo "开始实时监控..." tail -f "${log_file}" else echo -e "${RED}[错误]${NC} 日志文件不存在: ${log_file}" echo "请确认服务器已启动并产生日志输出" read -p "按任意键继续..." -n1 -s fi } # 查看控制台输出 view_console() { echo -e "${BLUE}[查看控制台输出]${NC}" echo "" local console_file="${LOG_DIR}/console.log" if [ -f "${console_file}" ]; then echo "控制台日志: ${console_file}" echo "" # 显示最后100行 tail -100 "${console_file}" else echo -e "${YELLOW}[警告]${NC} 控制台日志文件不存在: ${console_file}" fi echo "" read -p "按任意键继续..." -n1 -s } # 打开日志目录 open_log_dir() { echo -e "${BLUE}[打开日志目录]${NC}" echo "" if [ -d "${LOG_DIR}" ]; then echo "日志目录: ${LOG_DIR}" echo "" # 显示目录内容 ls -la "${LOG_DIR}/" echo "" # 显示文件大小 echo "文件大小:" du -sh "${LOG_DIR}"/* # 提供查看选项 echo "" echo "请选择要查看的文件:" local files=($(ls "${LOG_DIR}"/*.log 2>/dev/null)) if [ ${#files[@]} -eq 0 ]; then echo "未找到日志文件" else select file in "${files[@]}" "返回"; do case ${file} in "返回") break ;; *) if [ -f "${file}" ]; then echo "" echo "文件内容 (${file}):" echo "" head -50 "${file}" echo "" read -p "是否查看完整文件? (y/n): " choice if [[ "${choice}" =~ ^[Yy]$ ]]; then less "${file}" fi fi break ;; esac done fi else echo -e "${RED}[错误]${NC} 日志目录不存在: ${LOG_DIR}" fi read -p "按任意键继续..." -n1 -s } # 清理旧日志 clean_old_logs() { echo -e "${BLUE}[清理旧日志]${NC}" echo "" if [ ! -d "${LOG_DIR}" ]; then echo -e "${RED}[错误]${NC} 日志目录不存在: ${LOG_DIR}" read -p "按任意键继续..." -n1 -s return fi echo "将删除30天前的日志文件" echo "" # 显示将要删除的文件 echo "找到以下30天前的日志文件:" find "${LOG_DIR}" -name "*.log" -mtime +30 -type f find "${LOG_DIR}" -name "*.gz" -mtime +30 -type f find "${LOG_DIR}" -name "*.zip" -mtime +30 -type f echo "" read -p "确定要删除这些文件吗? (y/n): " choice if [[ "${choice}" =~ ^[Yy]$ ]]; then # 删除30天前的文件 find "${LOG_DIR}" -name "*.log" -mtime +30 -type f -delete find "${LOG_DIR}" -name "*.gz" -mtime +30 -type f -delete find "${LOG_DIR}" -name "*.zip" -mtime +30 -type f -delete echo -e "${GREEN}[成功]${NC} 旧日志已清理" else echo -e "${YELLOW}[信息]${NC} 操作已取消" fi echo "" read -p "按任意键继续..." -n1 -s } # 备份日志 backup_logs() { echo -e "${BLUE}[备份日志]${NC}" echo "" if [ ! -d "${LOG_DIR}" ]; then echo -e "${RED}[错误]${NC} 日志目录不存在: ${LOG_DIR}" read -p "按任意键继续..." -n1 -s return fi # 创建备份目录 if [ ! -d "${BACKUP_DIR}" ]; then mkdir -p "${BACKUP_DIR}" echo "创建备份目录: ${BACKUP_DIR}" fi local timestamp=$(date '+%Y%m%d_%H%M%S') local backup_file="${BACKUP_DIR}/logs_backup_${timestamp}.tar.gz" echo "正在备份日志到: ${backup_file}" echo "" # 创建备份 tar -czf "${backup_file}" -C "${WORK_DIR}" "${LOG_DIR##*/}" 2>/dev/null if [ $? -eq 0 ]; then echo -e "${GREEN}[成功]${NC} 备份完成" echo "备份文件: ${backup_file}" echo "文件大小: $(du -h "${backup_file}" | cut -f1)" else echo -e "${RED}[错误]${NC} 备份失败" fi echo "" read -p "按任意键继续..." -n1 -s } # 系统资源监控 monitor_system() { echo -e "${BLUE}[系统资源监控]${NC}" echo "" # 检查进程是否存在 if pgrep -f "lims-server.*jar" > /dev/null; then local pid=$(pgrep -f "lims-server.*jar") echo "进程ID: ${pid}" echo "监控时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "" # 监控循环 for i in {1..10}; do echo -e "${BLUE}[监控 ${i}/10]${NC}" # CPU 使用率 echo "CPU使用率:" ps -p ${pid} -o %cpu,cmd --no-headers # 内存使用 echo "内存使用:" ps -p ${pid} -o rss,vsz,cmd --no-headers | awk '{printf "物理内存: %.2f MB, 虚拟内存: %.2f MB\n", $1/1024, $2/1024}' # JVM统计(如果可用) if command -v jstat &> /dev/null; then echo "JVM堆内存:" jstat -gc ${pid} 2>/dev/null | tail -1 | awk '{ printf "堆使用: %.2f MB / %.2f MB (%.1f%%)\n", ($3+$4+$6+$8)/1024, ($1+$2+$5+$7)/1024, (($3+$4+$6+$8)/($1+$2+$5+$7))*100 }' fi echo "" sleep 2 done else echo -e "${RED}[错误]${NC} 未找到LIMS Server进程" fi echo "" read -p "按任意键继续..." -n1 -s } # JVM 监控 monitor_jvm() { echo -e "${BLUE}[JVM 监控]${NC}" echo "" if pgrep -f "lims-server.*jar" > /dev/null; then local pid=$(pgrep -f "lims-server.*jar") if command -v jstat &> /dev/null; then echo "JVM统计信息 (进程ID: ${pid}):" echo "" # 显示JVM统计表头 jstat -gc ${pid} echo "" echo "GC统计:" jstat -gcutil ${pid} echo "" echo "类加载统计:" jstat -class ${pid} echo "" echo "JIT编译统计:" jstat -compiler ${pid} else echo -e "${YELLOW}[警告]${NC} jstat命令未找到,无法获取JVM统计信息" echo "请安装JDK开发工具包" fi else echo -e "${RED}[错误]${NC} 未找到LIMS Server进程" fi echo "" read -p "按任意键继续..." -n1 -s } # 主函数 main() { while true; do show_menu read -p "请选择 (0-11): " choice case ${choice} in 1) echo "" bash /opt/lims-server/start-server.sh start ;; 2) echo "" bash /opt/lims-server/start-server.sh stop ;; 3) echo "" bash /opt/lims-server/start-server.sh restart ;; 4) echo "" check_status ;; 5) echo "" view_log ;; 6) echo "" view_console ;; 7) echo "" open_log_dir ;; 8) echo "" clean_old_logs ;; 9) echo "" backup_logs ;; 10) echo "" monitor_system ;; 11) echo "" monitor_jvm ;; 0) echo "" echo -e "${GREEN}[信息]${NC} 退出管理工具" echo "" exit 0 ;; *) echo "" echo -e "${RED}[错误]${NC} 无效选择" sleep 1 ;; esac done } # 执行主函数 main

4. 安装和部署脚本 (install-lims.sh)

bash

#!/bin/bash # ======================================== # LIMS Server 安装脚本 (Linux版本) # ======================================== # 定义颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 配置参数 INSTALL_DIR="/opt/lims-server" SERVICE_USER="limsuser" SERVICE_GROUP="limsgroup" # 打印彩色消息函数 print_info() { echo -e "${BLUE}[信息]${NC} $1"; } print_success() { echo -e "${GREEN}[成功]${NC} $1"; } print_warning() { echo -e "${YELLOW}[警告]${NC} $1"; } print_error() { echo -e "${RED}[错误]${NC} $1"; } # 检查是否为root用户 check_root() { if [ "$EUID" -ne 0 ]; then print_error "请使用root权限运行此脚本" print_info "请使用: sudo $0" exit 1 fi } # 检查Java环境 check_java() { print_info "检查Java环境..." if ! command -v java &> /dev/null; then print_warning "未检测到Java环境" read -p "是否安装OpenJDK 11? (y/n): " choice if [[ "${choice}" =~ ^[Yy]$ ]]; then install_java else print_error "安装已取消" exit 1 fi else java_version=$(java -version 2>&1 | head -1 | cut -d'"' -f2) print_success "Java已安装 (版本: ${java_version})" fi } # 安装Java install_java() { print_info "正在安装OpenJDK 11..." # 检测包管理器 if command -v apt &> /dev/null; then # Debian/Ubuntu apt update apt install -y openjdk-11-jdk elif command -v yum &> /dev/null; then # CentOS/RHEL yum install -y java-11-openjdk-devel elif command -v dnf &> /dev/null; then # Fedora dnf install -y java-11-openjdk-devel else print_error "不支持的Linux发行版" exit 1 fi if [ $? -eq 0 ]; then print_success "Java安装完成" else print_error "Java安装失败" exit 1 fi } # 创建服务用户和组 create_service_user() { print_info "创建服务用户和组..." # 检查用户是否存在 if id "${SERVICE_USER}" &>/dev/null; then print_warning "用户 ${SERVICE_USER} 已存在" else useradd -r -s /bin/false "${SERVICE_USER}" print_success "创建用户: ${SERVICE_USER}" fi # 检查组是否存在 if getent group "${SERVICE_GROUP}" &>/dev/null; then print_warning "组 ${SERVICE_GROUP} 已存在" else groupadd "${SERVICE_GROUP}" print_success "创建组: ${SERVICE_GROUP}" fi # 将用户添加到组 usermod -a -G "${SERVICE_GROUP}" "${SERVICE_USER}" } # 创建目录结构 create_directories() { print_info "创建目录结构..." # 创建主目录 if [ ! -d "${INSTALL_DIR}" ]; then mkdir -p "${INSTALL_DIR}" print_success "创建目录: ${INSTALL_DIR}" fi # 创建日志目录 mkdir -p "${INSTALL_DIR}/logs" print_success "创建日志目录: ${INSTALL_DIR}/logs" # 创建备份目录 mkdir -p "/opt/lims-backup" print_success "创建备份目录: /opt/lims-backup" } # 设置目录权限 set_permissions() { print_info "设置目录权限..." # 设置所有权 chown -R "${SERVICE_USER}:${SERVICE_GROUP}" "${INSTALL_DIR}" chown -R "${SERVICE_USER}:${SERVICE_GROUP}" "/opt/lims-backup" # 设置权限 chmod 755 "${INSTALL_DIR}" chmod 755 "/opt/lims-backup" chmod 755 "${INSTALL_DIR}/logs" print_success "权限设置完成" } # 复制JAR文件 copy_jar_file() { print_info "复制JAR文件..." local jar_source="" # 查找JAR文件 if [ -f "lims-server-1.0-SNAPSHOT.jar" ]; then jar_source="lims-server-1.0-SNAPSHOT.jar" elif [ -f "../lims-server-1.0-SNAPSHOT.jar" ]; then jar_source="../lims-server-1.0-SNAPSHOT.jar" else print_warning "未找到JAR文件" read -p "请输入JAR文件完整路径: " jar_source fi if [ -f "${jar_source}" ]; then cp "${jar_source}" "${INSTALL_DIR}/" print_success "JAR文件已复制到: ${INSTALL_DIR}/" else print_error "JAR文件不存在: ${jar_source}" exit 1 fi } # 安装启动脚本 install_startup_scripts() { print_info "安装启动脚本..." # 复制启动脚本 if [ -f "start-server.sh" ]; then cp start-server.sh "${INSTALL_DIR}/" chmod +x "${INSTALL_DIR}/start-server.sh" print_success "启动脚本已安装" fi # 复制管理工具 if [ -f "lims-tools.sh" ]; then cp lims-tools.sh "${INSTALL_DIR}/" chmod +x "${INSTALL_DIR}/lims-tools.sh" # 创建符号链接到/usr/local/bin ln -sf "${INSTALL_DIR}/lims-tools.sh" "/usr/local/bin/lims-tools" print_success "管理工具已安装" fi } # 配置系统服务 configure_systemd_service() { print_info "配置系统服务..." # 检查systemd if ! command -v systemctl &> /dev/null; then print_warning "systemd未找到,跳过服务配置" return fi # 创建服务文件 cat > /etc/systemd/system/lims-server.service << EOF [Unit] Description=LIMS Server Application After=network.target [Service] Type=simple User=${SERVICE_USER} Group=${SERVICE_GROUP} WorkingDirectory=${INSTALL_DIR} ExecStart=/usr/bin/java -Djdk.tls.client.protocols=TLSv1 -Djsse.enableSNIExtension=false -Djdk.tls.allowUnsafeServerCertChange=true -jar ${INSTALL_DIR}/lims-server-1.0-SNAPSHOT.jar --server.port=8085 SuccessExitStatus=143 Restart=always RestartSec=10 StandardOutput=append:${INSTALL_DIR}/logs/console.log StandardError=append:${INSTALL_DIR}/logs/error.log # 日志配置 SyslogIdentifier=lims-server SyslogFacility=local7 # 资源限制 LimitNOFILE=65536 LimitNPROC=4096 [Install] WantedBy=multi-user.target EOF # 重新加载systemd配置 systemctl daemon-reload # 启用服务自启动 systemctl enable lims-server.service print_success "系统服务配置完成" } # 创建环境配置文件 create_environment_file() { print_info "创建环境配置文件..." cat > "${INSTALL_DIR}/lims-server.env" << EOF # LIMS Server 环境配置 WORK_DIR="${INSTALL_DIR}" JAR_NAME="lims-server-1.0-SNAPSHOT.jar" PORT="8085" APP_NAME="lims-server" LOG_DIR="logs" JVM_OPTS="-Djdk.tls.client.protocols=TLSv1 -Djsse.enableSNIExtension=false -Djdk.tls.allowUnsafeServerCertChange=true" APP_OPTS="--server.port=\${PORT}" EOF print_success "环境配置文件已创建" } # 完成安装 complete_installation() { print_success "========================================" print_success " LIMS Server 安装完成!" print_success "========================================" echo "" echo "安装信息:" echo " 安装目录: ${INSTALL_DIR}" echo " 服务用户: ${SERVICE_USER}" echo " 服务端口: 8085" echo " 日志目录: ${INSTALL_DIR}/logs" echo "" echo "管理命令:" echo " 启动服务: systemctl start lims-server" echo " 停止服务: systemctl stop lims-server" echo " 服务状态: systemctl status lims-server" echo " 查看日志: journalctl -u lims-server" echo " 管理工具: lims-tools" echo "" echo "启动脚本:" echo " ${INSTALL_DIR}/start-server.sh {start|stop|restart|status}" echo "" # 询问是否立即启动服务 read -p "是否立即启动服务? (y/n): " choice if [[ "${choice}" =~ ^[Yy]$ ]]; then systemctl start lims-server systemctl status lims-server --no-pager fi } # 主安装函数 main_install() { check_root check_java create_service_user create_directories copy_jar_file install_startup_scripts configure_systemd_service set_permissions create_environment_file complete_installation } # 执行安装 main_install

5. 使用说明

安装步骤

bash

# 1. 下载脚本 sudo wget -O /tmp/install-lims.sh https://example.com/install-lims.sh # 2. 添加执行权限 sudo chmod +x /tmp/install-lims.sh # 3. 运行安装脚本 sudo /tmp/install-lims.sh # 4. 将JAR文件放在当前目录,或者根据提示提供路径

基本命令

bash

# 使用启动脚本 cd /opt/lims-server ./start-server.sh start # 启动 ./start-server.sh stop # 停止 ./start-server.sh restart # 重启 ./start-server.sh status # 状态 ./start-server.sh log # 查看日志 # 使用管理工具 lims-tools # 图形化菜单管理 # 使用systemd服务 sudo systemctl start lims-server sudo systemctl stop lims-server sudo systemctl restart lims-server sudo systemctl status lims-server sudo journalctl -u lims-server -f # 查看服务日志

功能特点

  1. 完整的管理功能:启动、停止、重启、状态监控

  2. 实时日志查看:支持tail -f实时监控

  3. 日志管理:备份、清理、查看

  4. 资源监控:CPU、内存、JVM监控

  5. 权限管理:专用服务用户和组

  6. 系统集成:支持systemd服务管理

  7. 错误处理:完善的错误检测和提示

  8. 颜色输出:直观的彩色控制台输出

这些脚本为Linux环境提供了完整的企业级部署方案,支持生产环境的运维需求。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/13 14:28:27

2025CRM选型手册:主流CRM品牌客户 - 销售 - 团队管理能力 场景化对比

在数字化转型背景下&#xff0c;CRM&#xff08;客户关系管理&#xff09;已从“销售工具”升级为“企业增长引擎”。企业对CRM的需求不再局限于“记录客户信息”&#xff0c;而是要求全链路的客户生命周期管理、精细化的销售过程管控、协同化的团队效能提升。本文选取超兔一体…

作者头像 李华
网站建设 2026/1/13 7:03:12

AI口碑决胜未来:2025年智能洞察与AI市场舆情分析平台深度对决

步入2025年&#xff0c;商业世界的竞争法则正被重塑。对于任何一位企业决策者而言&#xff0c;市场不再是熟悉的滩涂&#xff0c;而是一片瞬息万变的深海。信息爆炸如同海啸&#xff0c;裹挟着抖音的爆款视频、小红书的种草笔记、微信公众号的深度评测&#xff0c;将消费者的声…

作者头像 李华
网站建设 2026/1/10 15:27:12

5分钟掌握Nginx LDAP认证系统部署技巧

5分钟掌握Nginx LDAP认证系统部署技巧 【免费下载链接】nginx-ldap-auth Example of LDAP authentication using ngx_http_auth_request_module 项目地址: https://gitcode.com/gh_mirrors/ng/nginx-ldap-auth 在企业级Web应用中&#xff0c;安全身份验证是保护敏感数据…

作者头像 李华
网站建设 2026/1/12 11:12:11

基于否定选择算法的异常检测技术详解

基于否定选择算法&#xff08;Negative Selection Algorithm, NSA&#xff09;的异常检测技术详解一、算法基础原理 1. 生物启发机制 免疫耐受过程&#xff1a;模拟T细胞在胸腺中的自体耐受机制&#xff0c;通过删除与自体&#xff08;正常样本&#xff09;匹配的候选检测器&am…

作者头像 李华
网站建设 2026/1/12 0:41:41

手把手根治Qwen-Agent工具重复调用:实战优化指南

手把手根治Qwen-Agent工具重复调用&#xff1a;实战优化指南 【免费下载链接】Qwen-Agent Agent framework and applications built upon Qwen, featuring Code Interpreter and Chrome browser extension. 项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen-Agent …

作者头像 李华
网站建设 2026/1/13 9:16:36

系统管理shutdown命令

shutdown命令行关机命令。shutdown [{-i|-l|-s|-r|-a}] [-f] [-m \\computername] [-t xx] [-c "message"]命令参数&#xff1a;-i 显示图形化界面&#xff0c;必须是第一个参数。-l 注销当前用户&#xff0c;默认设置。-s 关闭本地计算机。-r 重新启动。-a 终止关…

作者头像 李华