我有一个 Spring Boot 应用,我想开始使用它System V Init
。我的 jar 文件位于/var/my-app/my-app-0.0.1-SNAPSHOT.jar
。因此,我使用以下命令创建了一个符号链接
sudo ln -s /var/my-app/my-app-0.0.1-SNAPSHOT.jar /etc/init.d/my-app-0.0.1-SNAPSHOT
没有任何问题。但是当我尝试
sudo service my-app-0.0.1-SNAPSHOT start
我收到错误:
/etc/init.d/my-app-0.0.1-SNAPSHOT: 1: /etc/init.d/myapp-0.0.1-SNAPSHOT: Syntax error: Unterminated quoted string
有人知道我做错了什么吗?谢谢。
答案1
Ubuntu 使用 systemd。你可以在这里找到有人问过类似问题的帖子邮政
另一种方法是使用一些编排工具(例如 kubernetes 或 docker swarm)来创建即使在某个时间点失败也可以重新运行的服务。
使用docker的示例:
在你的Dockerfile
FROM java:8-jre-alpine
COPY /location/of/your/jar/xyz.jar /where/you/want/it/stored/xyz.jar
CMD ["/bin/sh", "-c", "java -jar /where/you/want/it/stored/xyz.jar"]
构建你的 docker 镜像
docker build \
-t my-app:0.0.1-snapshot \ #specify a name for your image
/dockerfile/location/ # the location of your dockerfile
去测试
docker run -it \ # -it represents interactive tty
-p 80:8080 \ # -p binds 8080 (the container port) to 80 (host port)
--restart=always \ # --restart=always run the service unless stopped by user
--name my-app \ # --name the name of your container
my-app:0.0.1-snapshot # the image you built with the build command
使用 postman 或浏览器测试您的本地主机。您可以尝试重新启动计算机,应用程序仍应运行。在生产中,您可以使用 swarm 或 kubernetes。
要使用 swarm,您需要创建一个docker-compose.yml
文件,并且您应该将您的图像存储在注册表中 - 如果未将构建的图像推送到注册表,则管理节点上必须存在构建的图像。
在你的docker-compose.yml
version: '3.5'
services:
my-app:
image: my-app:0.0.1-snapshot
ports:
- "80:8080"
restart: always
在终端:
docker swarm init
docker stack deploy my-app --compose-file ./docker-compose.yml
你应该看看他们的文档用于持久性和安全性等其他事项。
答案2
为了防止将来对其他人有所帮助,我设法使用 来让它工作upstart
。原始答案可以找到这里。
为了方便起见,我将在这里复制并粘贴 Patrk Bego 的答案:
您首先必须定义 Upstart 脚本(对于 Ubuntu 14.04),它位于 /etc/init/ 中并以 .conf 结尾。(http://upstart.ubuntu.com/cookbook/)
# <service name>.conf
start on filesystem
exec /usr/bin/java -jar /path_to/program
对于 Ubuntu 16.06+(你可以找到很好的文章这里)
sudo vim /etc/systemd/system/my-webapp.service
然后你可以这样运行它:
sudo service <your service name> start
希望有所帮助。