You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 14.04.1部署SpringBoot Jar为SystemV服务时遇语法错误

问题原因分析

你遇到的语法错误本质是直接将Jar文件软链接到/etc/init.d/目录不符合SystemV服务的要求。

SystemV的/etc/init.d/目录下的文件必须是符合规范的Shell脚本,需要包含start、stop、restart等标准服务控制逻辑。而你通过ln -s创建的软链接指向的是Jar二进制文件,当service命令尝试执行它时,会把Jar文件当作Shell脚本解析,Jar文件的二进制内容完全不符合Shell语法,因此会抛出语法错误。

至于开发机器上能正常工作,大概率是你在开发机上误操作了(比如实际创建了正确的init脚本而非软链接),或者开发机的环境有特殊兼容处理,但这不是标准做法。

解决办法

我们需要创建一个符合SystemV规范的init脚本来管理你的SpringBoot应用,步骤如下:

  1. 删除错误的软链接

    sudo rm /etc/init.d/my_web_app
    
  2. 创建SystemV init脚本
    使用文本编辑器创建脚本文件:

    sudo nano /etc/init.d/my_web_app
    

    将以下内容粘贴进去(根据你的实际路径调整APP_JAR和USER变量):

    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides:          my_web_app
    # Required-Start:    $remote_fs $syslog
    # Required-Stop:     $remote_fs $syslog
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: Starts and stops the SpringBoot web application
    # Description:       Manages the lifecycle of my_web_app SpringBoot service
    ### END INIT INFO
    
    # 配置变量
    APP_JAR="/home/myUser/my_web_app.jar"
    USER="webUser"
    APP_NAME="my_web_app"
    PID_FILE="/var/run/$APP_NAME.pid"
    
    case "$1" in
        start)
            echo "Starting $APP_NAME..."
            su - $USER -c "nohup java -jar $APP_JAR > /var/log/$APP_NAME.log 2>&1 & echo \$! > $PID_FILE"
            ;;
        stop)
            echo "Stopping $APP_NAME..."
            if [ -f $PID_FILE ]; then
                kill $(cat $PID_FILE) && rm $PID_FILE
            else
                echo "$APP_NAME is not running."
            fi
            ;;
        restart)
            $0 stop
            sleep 2
            $0 start
            ;;
        status)
            if [ -f $PID_FILE ] && kill -0 $(cat $PID_FILE) 2>/dev/null; then
                echo "$APP_NAME is running (PID: $(cat $PID_FILE))"
            else
                echo "$APP_NAME is not running."
            fi
            ;;
        *)
            echo "Usage: $0 {start|stop|restart|status}"
            exit 1
            ;;
    esac
    exit 0
    
  3. 设置脚本权限
    给脚本添加可执行权限:

    sudo chmod 755 /etc/init.d/my_web_app
    
  4. 注册服务到SystemV
    让系统识别这个服务并设置开机自启:

    sudo update-rc.d my_web_app defaults
    
  5. 测试服务控制
    现在你可以正常使用service命令管理应用了:

    # 启动服务
    sudo service my_web_app start
    # 查看状态
    sudo service my_web_app status
    # 停止服务
    sudo service my_web_app stop
    

另外,脚本中已经配置了日志输出到/var/log/my_web_app.log,如果需要调整日志路径可以修改脚本中的对应部分。

内容的提问来源于stack exchange,提问作者SuperLucky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:58:03