我有一个打包为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)。
答案 0 :(得分:1)
问题是这两行:
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文件中设置执行位将无济于事。 OS内核不知道如何运行它。要运行常规JAR,必须执行命令java -jar /path/to/the.jar
。如有必要,您可以创建一个简单的包装脚本来执行此操作。
1-有一种方法可以生成一个特殊的“完全可执行”的SpringBoot JAR文件,该文件之前带有一个shell脚本。参见"Installing Spring Boot Applications"。尽管文档指出这些特殊的JAR文件会导致某些工具出现问题,但这是解决此问题的一种方法。
问题2::/etc/init.d
中的文件应该是服务脚本。
它们不仅仅是服务的可执行文件。这些脚本应该是能够理解诸如start
,stop
,restart
,reload
等动词的shell脚本。并且(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。为生产服务器使用寿命终止的操作系统是不明智的。
请注意,网上有很多文档,以及许多关于新旧配置服务方式的文章。 (Google是您的朋友。)
答案 1 :(得分:0)
非常感谢@Stephne C的详细回答。经过一番摸索后,我发现spring boot为Ubuntu和CentOS提供了开箱即用的服务实践Here。
我犯的主要错误不是将项目打包为可执行jar。
要使springboot jar可执行,请编辑POM文件,将<executbale>
标记添加到spring-boot-maven-plugin的<configuration>
标记中:
<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打包并上传到服务器
chown
将罐子发送给nologin用户,该服务将由其所有者运行。
chmod 500
jar授予其可执行权限。
向/etc/init.d添加软链接以将其重新注册为服务。
运行服务,到目前为止一切顺利。
但是正如@Stephen C所说,默认选项既不够安全也不是最新的。我认为最好是打包一个胖子然后在生产环境中手动配置服务。