为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

胡子哥哥 2023-03-17 15:26:07
我有一个打包为 jar 文件的 springboot web 应用程序。并且产品服务器是安装了openjdk-8-jdk的Ubuntu 14.04.1。我可以使用以下方法成功运行应用程序:sudo java -jar /home/myUser/my_web_app.jar然后我通过以下命令将此应用程序作为 SystemV 服务:sudo useradd webUsersudo passwd webUsersudo chown webUser:webUser /home/myUser/my_web_app.jarsudo chmod 500 /home/myUser/my_web_app.jarsudo 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)。
查看完整描述

2 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

问题是这两行:

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应该是服务脚本。

它们不仅仅是服务的可执行文件。这些脚本应该是能够理解诸如startstop,restart等动词的 shell 脚本reload。并且(AFAIK)它们必须编码为sh兼容的 shell 脚本。这是一篇描述服务脚本结构的文章:

(但请先阅读问题 #4!!)

问题 #3:运行服务root可能存在安全风险。

最好创建一个(非特权)服务帐户来运行该服务。如果服务暴露在网络中,这一点尤其重要。(如果坏人可以通过网络“破解”该服务并使其做出不受欢迎的事情,那么它以 root 身份运行的事实会使整个系统处于危险之中。)

问题 #4: /etc/init.d/脚本已过时。

如果您使用的是最新的 Ubuntu 版本(15.04 或更高版本),这些/etc/init.d/脚本是“传统”配置方式。该initd机制的当前迭代是systemd. 它使用systemd 单元文件文件而不是服务脚本。以下文章提供了更多信息:

systemd服务包括遗留服务脚本,但它们不如单元文件强大、灵活和……简洁……。

问题 #5: Ubuntu 14.04 LTS 已停产。

您应该升级到 16.04 LTS 或最好是 18.04 LTS。为您的生产服务器使用生命周期结束的操作系统是不明智的。


请注意,网络上有很多文档和很多文章都介绍了配置服务的新旧方法。(谷歌是你的朋友。)


查看完整回答
反对 回复 2023-03-17
?
ITMISS

TA贡献1871条经验 获得超8个赞

经过一番搜索后,我发现 spring boot为Ubuntu 和 CentOS提供了开箱即用的服务实践。

我犯的主要错误是没有将我的项目打包为可执行 jar。

要使 springboot jar 可执行,编辑 POM 文件,将<executbale>标签添加到<configuration>spring-boot-maven-plugin 的标签中,如下所示:

<project>

   ...

   <build>

      <plugins>

         <plugin>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-maven-plugin</artifactId>

            <configuration>

               <executable>true</executable>

            </configuration>

         </plugin>

         ...

      </plugins>

   </build>

   ...

</project>

打包上传新的可执行jar到服务器


chownjar 给 nologin 用户,该服务将由它的所有者运行。


chmod 500jar 给它可执行权限。


添加到 /etc/init.d 的软链接以将其注册为服务。


运行服务,到目前为止一切顺利。


但正如@Stephen C 所说,默认选项既不够安全也不是最新的。我认为最好只打包一个 fat jar 并在生产环境中手动配置服务。


查看完整回答
反对 回复 2023-03-17
  • 2 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信