如何通过Jenkins持久后台运行Spring Boot Web应用Jar包?
Jenkins Freestyle项目持久运行Spring Boot应用的解决方法
问题根源
Jenkins构建任务结束时,会终止所有由该任务创建的子进程(包括通过nohup ... &启动的后台Java进程)。添加sleep只是延迟了Jenkins的进程清理时间,并非真正解决问题。
可行解决方案
1. 完全脱离Jenkins的IO流关联
修改执行shell命令,将标准输出和错误输出重定向到/dev/null,切断进程与Jenkins的IO关联:
cd /opt/jenkins_WORKSHOP nohup java -jar spring-boot-simple-web.jar > /dev/null 2>&1 &
> /dev/null:将标准输出丢弃到空设备2>&1:将错误输出重定向到标准输出,一并丢弃
这样Jenkins无法捕获进程的IO资源,任务结束后不会终止该进程。
2. 使用disown脱离shell作业列表
在启动后台进程后,用disown将其从当前shell的作业列表中移除,避免shell退出时发送终止信号:
cd /opt/jenkins_WORKSHOP nohup java -jar spring-boot-simple-web.jar & disown
3. 用systemd管理应用(生产环境推荐)
通过systemd创建服务来管理Spring Boot应用,完全脱离Jenkins构建生命周期,还能实现自动重启等功能:
- 创建systemd服务文件
/etc/systemd/system/spring-boot-app.service:
[Unit] Description=Simple Spring Boot Web Application After=network.target [Service] User=jenkins WorkingDirectory=/opt/jenkins_WORKSHOP ExecStart=/usr/bin/java -jar spring-boot-simple-web.jar Restart=always # 进程崩溃时自动重启 [Install] WantedBy=multi-user.target
- 在Jenkins执行shell中执行命令更新并重启服务:
sudo systemctl daemon-reload sudo systemctl restart spring-boot-app.service
注意事项
不要依赖sleep这类临时方案,它仅延迟了进程被清理的时间,无法实现持久运行。生产环境优先使用systemd管理服务,稳定性和可维护性更强。
内容的提问来源于stack exchange,提问作者Imranmadbar
相关产品推荐
相关产品推荐

