jenkins部署java服务发生(code=exited, status=203/EXEC)

背景:新开发一个java服务,写完部署用公司共用的jenkins服务部署发现报错,报错如下。

1、使用systemctl status xxx-xx-xx-service.service查看该服务发现,也可以使用cat /var/log/message查看系统日志找报错原因。

xxx-xxx-xxx-service.service - xxx-xxx-xxx-SERVICE
   Loaded: loaded (/usr/lib/systemd/system/xxx-xxx-xxx-service.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Tue 2023-08-29 15:03:50 CST; 38s ago
  Process: 29024 ExecStart=/data/apps/xxx-xxx-xxx-xxx/xxx-xxx-xxx-SERVICE (code=exited, status=203/EXEC)
 Main PID: 29024 (code=exited, status=203/EXEC)

Aug 29 15:03:50 test-auth-server systemd[1]: Started xxx-xxx-xxx-SERVICE.
Aug 29 15:03:50 test-auth-server systemd[1]: Starting xxx-xxx-xxx-SERVICE...
Aug 29 15:03:50 test-auth-server systemd[1]: xxx-xxx-xxx-service.service: main process exited, code=exited, status=203/EXEC
Aug 29 15:03:50 test-auth-server systemd[1]: Unit xxx-xxx-xxx-service.service entered failed state.
Aug 29 15:03:50 test-auth-server systemd[1]: xxx-xxx-xxx-service.service failed.

这个日志中(code=exited, status=203/EXEC)这个是错误信息,我百度了一下,查了半天也没发现到底什么原因,因为平常直接复制jenkins已有的项目配置部署没问题,这个是自己新开发的项目不知道为什么,一直失败,jenkins一直在做健康检查。
就像这样,连服务都没启动(最后发现其实是maven配置的问题)。

FAILED - RETRYING: Healthcheck | Wait for xxx-xx-xx-service to be healthy on URLs [u'http://localhost:8098/actuator/health'] (40 retries left).

2、使用systemctl命令查不出来所以然,就尝试看var/log/message系统日志,最终查到了相关信息是。

 systemd: Started xx-xxx-xxx-SERVICE.
 systemd: Starting xxx-xxx-xxx-SERVICE...
 systemd: Failed at step EXEC spawning /data/apps/xx-xx-xxx-SERVICE/xx-xx-xx-SERVICE: Exec format error
 systemd: xx-xx-xxx-service.service: main process exited, code=exited, status=203/EXEC
 systemd: Unit xxx-xxx-xxx-service.service entered failed state.
 systemd: xxx-xxx-xxx-service.service failed.
 yanfa: [euid=yanfa]:yanfa pts/6 2023-08-28 12:57 (10.19.69.228):[/data/apps]2023-08-28 12:57:36 yanfa ll
 ansible-systemd: Invoked with no_block=False force=None name=xxx-xxx-service daemon_reexec=False enabled=True daemon_reload=False state=restarted masked=None scope=None user=None

最终定位到

Failed at step EXEC spawning /data/apps/xx-xx-xxx-SERVICE/xx-xx-xx-SERVICE: Exec format error

这个是说这个文件 有问题,通过file 命令看到这个其实就是打包后的jar文件了。
file /data/apps/xxx-xxx-SERVICE/xxx-xx-xx-SERVICE.它是一个软连接,到这其实要开始运行jar文件然后启动java服务,但是就是这的问题,导致服务没启动。
这个是查的原因:

根据你提供的信息,这个符号链接指向了一个名为 engine-0.0.1-SNAPSHOT.jar 的 JAR 文件,但是启动服务时却出现了 status=203/EXEC 的错误,这通常是由于二进制文件格式不正确导致的。

可能的原因包括:

JAR 文件的权限不正确,导致无法执行。
JAR 文件的格式不正确,无法在当前系统上执行。
JAR 文件的依赖项不正确,导致无法执行。
你可以尝试使用 java -jar 命令来手动执行 JAR 文件,以便查看详细的错误信息。例如:

java -jar /data/apps/YSDQ-USER-LEVEL-SERVICE/YSDQ-USER-LEVEL-SERVICE
如果 JAR 文件能够正常执行,则说明问题可能出在服务启动脚本中。如果 JAR 文件无法执行,则需要检查 JAR 文件的权限、格式和依赖项,以便解决问题。

但是我还是没解决到底什么原因,最后问的同事,帮忙看了下maven的配置。

<plugin>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>true</executable>
        <mainClass>com.xxx.xxx.XXXServiceApplication</mainClass>
    </configuration>
    <version>${spring-boot.version}</version>
</plugin>

解释:

如果不设置 <executable>true</executable>,则Maven不会将生成的JAR文件标记为可执行文
件,这意味着你不能直接运行它,而需要手动指定Java命令来启动应用程序。设置 
<executable>true</executable> 可以使生成的JAR文件成为可执行文件,
使得你可以直接通过命令行启动应用程序。

你可能感兴趣的:(java,jenkins,java,运维)