在 ubuntu 14.04.1 上将 SpringBoot jar 作为服务部署后出现语法错误

我有一个打包为 jar 文件的 springboot web 应用程序。并且产品服务器是安装了openjdk-8-jdk的Ubuntu 14.04.1。


我可以使用以下方法成功运行应用程序:


sudo java -jar /home/myUser/my_web_app.jar

然后我通过以下命令将此应用程序作为 SystemV 服务:


sudo useradd webUser

sudo passwd webUser

sudo chown webUser:webUser /home/myUser/my_web_app.jar

sudo chmod 500 /home/myUser/my_web_app.jar

sudo ln -s /home/myUser/my_web_app.jar /etc/init.d/my_web_app

之后,当我运行时:


sudo service my_web_app start

错误引发为:


/etc/init.d/my_web_app: 1: /etc/init.d/my_web_app: Syntax error: ")" unexpected.

我想知道是什么原因导致此错误以及如何解决它。谢谢。


顺便说一句,同样的方法适用于我的开发机器(Ubuntu 14.04.6)。


胡子哥哥
浏览 119回答 2
2回答

Smart猫小萌

问题是这两行:sudo chmod 500 /home/myUser/my_web_app.jar sudo ln -s /home/myUser/my_web_app.jar /etc/init.d/my_web_app问题 #1:常规可执行 JAR 文件不是操作系统可识别的可执行格式1。在常规 JAR 文件上设置执行位无济于事。操作系统内核不知道如何运行它。要运行常规 JAR,您必须执行命令java -jar /path/to/the.jar。如有必要,您可以创建一个简单的包装器脚本来执行此操作。1 - 有一种方法可以生成一个特殊的“完全可执行”的 SpringBoot JAR 文件,该文件前面有一个 shell 脚本;请参阅“安装 Spring Boot 应用程序”。这是解决此问题的一种方法,尽管文档指出这些特殊的 JAR 文件会导致某些工具出现问题。问题 #2:中的文件/etc/init.d应该是服务脚本。它们不仅仅是服务的可执行文件。这些脚本应该是能够理解诸如start, stop,restart等动词的 shell 脚本reload。并且(AFAIK)它们必须编码为sh兼容的 shell 脚本。这是一篇描述服务脚本结构的文章:https://www.linux.com/learn/managing-linux-daemons-init-scripts(但请先阅读问题 #4!!)问题 #3:运行服务root可能存在安全风险。最好创建一个(非特权)服务帐户来运行该服务。如果服务暴露在网络中,这一点尤其重要。(如果坏人可以通过网络“破解”该服务并使其做出不受欢迎的事情,那么它以 root 身份运行的事实会使整个系统处于危险之中。)问题 #4: /etc/init.d/脚本已过时。如果您使用的是最新的 Ubuntu 版本(15.04 或更高版本),这些/etc/init.d/脚本是“传统”配置方式。该initd机制的当前迭代是systemd. 它使用systemd 单元文件文件而不是服务脚本。以下文章提供了更多信息:https://www.linux.com/learn/managing-linux-daemons-init-scripts该systemd服务包括遗留服务脚本,但它们不如单元文件强大、灵活和……简洁……。问题 #5: Ubuntu 14.04 LTS 已停产。您应该升级到 16.04 LTS 或最好是 18.04 LTS。为您的生产服务器使用生命周期结束的操作系统是不明智的。请注意,网络上有很多文档和很多文章都介绍了配置服务的新旧方法。(谷歌是你的朋友。)

ITMISS

经过一番搜索后,我发现 spring boot为Ubuntu 和 CentOS提供了开箱即用的服务实践。我犯的主要错误是没有将我的项目打包为可执行 jar。要使 springboot jar 可执行,编辑 POM 文件,将<executbale>标签添加到<configuration>spring-boot-maven-plugin 的标签中,如下所示:<project>&nbsp; &nbsp;...&nbsp; &nbsp;<build>&nbsp; &nbsp; &nbsp; <plugins>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<plugin>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <groupId>org.springframework.boot</groupId>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <artifactId>spring-boot-maven-plugin</artifactId>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <configuration>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<executable>true</executable>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </configuration>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</plugin>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;...&nbsp; &nbsp; &nbsp; </plugins>&nbsp; &nbsp;</build>&nbsp; &nbsp;...</project>打包上传新的可执行jar到服务器chownjar 给 nologin 用户,该服务将由它的所有者运行。chmod 500jar 给它可执行权限。添加到 /etc/init.d 的软链接以将其注册为服务。运行服务,到目前为止一切顺利。但正如@Stephen C 所说,默认选项既不够安全也不是最新的。我认为最好只打包一个 fat jar 并在生产环境中手动配置服务。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java