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

时间:2019-07-09 14:05:27

标签: java spring-boot ubuntu service

我有一个打包为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)。

2 个答案:

答案 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中的文件应该是服务脚本。

它们不仅仅是服务的可执行文件。这些脚本应该是能够理解诸如startstoprestartreload等动词的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所说,默认选项既不够安全也不是最新的。我认为最好是打包一个胖子然后在生产环境中手动配置服务。