背景:新开发一个java服务,写完部署用公司共用的jenkins服务部署发现报错,报错如下。
1、使用
systemctl status xxx-xx-xx-service.service
查看该服务发现,也可以使用
cat /var/log/message
查看系统日志找报错原因。
xxx-xxx-xxx-service.service - xxx-xxx-xxx-SERVICELoaded: loaded (/usr/lib/systemd/system/xxx-xxx-xxx-service.service; enabled; vendor preset: disabled)Active: failed (Result: exit-code) since Tue2023-08-2915:03:50CST;38s ago
Process:29024ExecStart=/data/apps/xxx-xxx-xxx-xxx/xxx-xxx-xxx-SERVICE(code=exited, status=203/EXEC)MainPID:29024(code=exited, status=203/EXEC)Aug2915:03:50 test-auth-server systemd[1]:Started xxx-xxx-xxx-SERVICE.
Aug2915:03:50 test-auth-server systemd[1]:Starting xxx-xxx-xxx-SERVICE...Aug2915:03:50 test-auth-server systemd[1]: xxx-xxx-xxx-service.service: main process exited, code=exited, status=203/EXECAug2915:03:50 test-auth-server systemd[1]:Unit xxx-xxx-xxx-service.service entered failed state.
Aug2915:03:50 test-auth-server systemd[1]: xxx-xxx-xxx-service.service failed.
这个日志中(code=exited, status=203/EXEC)这个是错误信息,我百度了一下,查了半天也没发现到底什么原因,因为平常直接复制jenkins已有的项目配置部署没问题,这个是自己新开发的项目不知道为什么,一直失败,jenkins一直在做健康检查。
就像这样,连服务都没启动(最后发现其实是maven配置的问题)。
FAILED-RETRYING:Healthcheck|Waitfor xxx-xx-xx-service tobe 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/62023-08-2812:57(10.19.69.228):[/data/apps]2023-08-2812:57:36 yanfa ll
ansible-systemd:Invokedwithno_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文件成为可执行文件,
使得你可以直接通过命令行启动应用程序。
版权归原作者 Nuyoahll-_-ll 所有, 如有侵权,请联系我们删除。