Spring Boot应用部署为Ubuntu System V Init服务启动报错求助
问题根源分析
你遇到的语法错误核心原因是:直接把Spring Boot的jar文件软链接到/etc/init.d目录是完全错误的操作。/etc/init.d下的文件必须是符合System V init规范的shell脚本,而不是可执行的jar包——系统会把这个jar当成shell脚本去解析,jar的二进制内容在shell看来就是乱码的脚本代码,自然会出现"引号未终止"这类语法错误。
正确的解决步骤
下面是配置System V init启动Spring Boot应用的完整流程:
1. 创建System V启动脚本
在/etc/init.d目录下创建一个简洁命名的脚本(建议用my-app代替带版本号的名称,方便后续维护):
sudo nano /etc/init.d/my-app
将以下内容粘贴进去,根据你的实际环境修改JAVA_HOME、JAR_PATH等参数:
#!/bin/sh ### BEGIN INIT INFO # Provides: my-app # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start/Stop My Spring Boot Application # Description: Manages the My Spring Boot Application service ### END INIT INFO # 配置应用参数 JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 # 替换成你的Java实际安装路径 JAR_PATH=/var/my-app/my-app-0.0.1-SNAPSHOT.jar PID_FILE=/var/run/my-app.pid LOG_FILE=/var/log/my-app.log start() { if [ -f $PID_FILE ] && kill -0 $(cat $PID_FILE); then echo "My App is already running..." return 1 fi echo "Starting My App..." nohup $JAVA_HOME/bin/java -jar $JAR_PATH > $LOG_FILE 2>&1 & echo $! > $PID_FILE echo "My App started successfully with PID $(cat $PID_FILE)" } stop() { if [ ! -f $PID_FILE ] || ! kill -0 $(cat $PID_FILE); then echo "My App is not running..." return 1 fi echo "Stopping My App..." kill $(cat $PID_FILE) rm $PID_FILE echo "My App stopped successfully" } restart() { stop start } case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) if [ -f $PID_FILE ] && kill -0 $(cat $PID_FILE); then echo "My App is running with PID $(cat $PID_FILE)" else echo "My App is not running" fi ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 ;; esac exit 0
2. 设置脚本可执行权限
执行命令给脚本添加可执行权限:
sudo chmod +x /etc/init.d/my-app
3. 注册服务到System V init
执行以下命令将脚本注册为系统服务,使其支持开机自动启动:
sudo update-rc.d my-app defaults
4. 测试服务启停
现在你可以用service命令正常管理你的应用了:
# 启动服务 sudo service my-app start # 查看运行状态 sudo service my-app status # 停止服务 sudo service my-app stop # 重启服务 sudo service my-app restart
额外提示
- 后续更新jar包时,只需要替换
/var/my-app下的jar文件,再执行sudo service my-app restart即可,无需修改启动脚本。 - 日志文件
/var/log/my-app.log可以帮助你排查应用启动或运行中的异常问题。
内容的提问来源于stack exchange,提问作者kovac
相关产品推荐
相关产品推荐

