【问题标题】:Installation of a Spring Boot application as an init.d service in Ubuntu 14.04 LTS在 Ubuntu 14.04 LTS 中将 Spring Boot 应用程序安装为 init.d 服务
【发布时间】:2017-08-20 14:19:27
【问题描述】:

我已经生成了一个 Spring Boot 应用程序。使用 maven,将 jar 移入

/var/licence/licence-0.0.1-SNAPSHOT.jar

然后

sudo ln -s /var/licence/licence-0.0.1-SNAPSHOT.jar /etc/init.d/licence

但是当我输入时

lopes@localhost:/var/licence$ service licence start
licence: unrecognized service

这些是/etc/init.d/licence的属性

lrwxrwxrwx   1 root root   46 Mar 27 18:17 licence -> /var/licence/licence-0.0.1-SNAPSHOT.jar

这是我的 pom.xml:

....

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>   
                <configuration>
                    <executable>true</executable>
                </configuration>            
            </plugin>
        </plugins>
    </build>
...

【问题讨论】:

  • 您是否按照参考指南中的说明创建了可执行 jar?
  • 是的,我按照参考 guid 中的说明创建了一个可执行 jar
  • 您使用的是哪个启动版本并检查了日志?如前所述here?

标签: java linux spring-boot ubuntu-14.04 init.d


【解决方案1】:

据我所知 /etc/init.d 只存储脚本文件。 你应该把脚本文件放在那里,你描述如何启动/停止你的服务。下面我编写了示例脚本,将其保存为/etc/init.d/license,您可以像这样启动/停止您的服务 sudo service license start

resource 中的示例脚本详细信息

#!/bin/sh
SERVICE_NAME=License
PATH_TO_JAR=/var/licence/licence-0.0.1-SNAPSHOT.jar
PID_PATH_NAME=/tmp/License.pid

case $1 in
    start)
        echo "Starting $SERVICE_NAME ..."
        if [ ! -f $PID_PATH_NAME ]; then
            nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null & 
                        echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is already running ..."
        fi
    ;;
    stop)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stoping ..."
            kill $PID;
            echo "$SERVICE_NAME stopped ..."
            rm $PID_PATH_NAME
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
    restart)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stopping ...";
            kill $PID;
            echo "$SERVICE_NAME stopped ...";
            rm $PID_PATH_NAME
            echo "$SERVICE_NAME starting ..."
            nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &
                        echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
esac 

【讨论】:

  • 可执行的 Spring Boot jar 是一个脚本,如 here 所述。
【解决方案2】:

您最好使用 systemd 单元文件,而不是老式的 /etc/init.d。 systemd 是大多数 Linux 发行版使用的init 系统,集成您的服务更容易(见下文)且功能更强大,因为您可以获得免费的监督、日志记录工具、对其他服务的依赖管理等等。

关于您的服务示例,您首先需要在目录/etc/systemd/system 中放置一个license.service,其内容如下:

[Unit]
Description=License service by MyCorp

[Service]
ExecStart=/var/licence/licence-0.0.1-SNAPSHOT.jar
User=myuser
Restart=on-failure

[Install]
WantedBy=default.target

然后运行这些命令:

#>systemctl daemon-reload
#>systemctl enable license
#>systemctl start license

请注意,SpringBoot 可以创建可执行的 JAR(即以 shell 脚本开头的 JAR),因此您无需显式调用 java。请参阅spring.io documentation 了解如何自定义。

【讨论】:

  • 您不需要java -jar 部分,因为jar 应该是可执行文件(脚本),如here 所述。
  • 谢谢。更新了答案
猜你喜欢
  • 2015-05-31
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 2015-09-25
  • 2016-02-24
  • 1970-01-01
相关资源
最近更新 更多