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应用,步骤如下:
删除错误的软链接
sudo rm /etc/init.d/my_web_app创建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设置脚本权限
给脚本添加可执行权限:sudo chmod 755 /etc/init.d/my_web_app注册服务到SystemV
让系统识别这个服务并设置开机自启:sudo update-rc.d my_web_app defaults测试服务控制
现在你可以正常使用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
相关产品推荐
相关产品推荐

