2 回答
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
应该是服务脚本。
它们不仅仅是服务的可执行文件。这些脚本应该是能够理解诸如start
, stop
,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。为您的生产服务器使用生命周期结束的操作系统是不明智的。
请注意,网络上有很多文档和很多文章都介绍了配置服务的新旧方法。(谷歌是你的朋友。)
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 并在生产环境中手动配置服务。
添加回答
举报