サービスとしてのSpring Bootアプリケーション


197

Linuxシステムのサービスとして実行可能jarとしてパッケージ化されたSpring Bootアプリケーションをうまく構成する方法は?これは推奨されるアプローチですか、それともこのアプリをwarに変換してTomcatにインストールする必要がありますか?

現在、screenセッションからSpringブートアプリケーションを実行できますが、サーバーの再起動後に手動で開始する必要があります。

私が探しているのはinit.d、実行可能jarを使用した私のアプローチが適切であれば、一般的なアドバイス/指示またはサンプルスクリプトです。


はじめに、ディストリビューションはupstartまたはsystemdを使用していますか?
yglodt 2014

回答:


138

以下は、springboot 1.3以降で機能します。

init.dサービスとして

実行可能jarには、通常の起動、停止、再起動、およびステータスコマンドがあります。また、通常の/ var / runディレクトリにPIDファイルを設定し、デフォルトで通常の/ var / logディレクトリにログを記録します。

jarを/etc/init.dにシンボリックリンクするだけです

sudo link -s /var/myapp/myapp.jar /etc/init.d/myapp

または

sudo ln -s ~/myproject/build/libs/myapp-1.0.jar /etc/init.d/myapp_servicename

その後、あなたはいつものことをすることができます

/etc/init.d/myapp start

次に、必要に応じて、起動時にアプリを起動/停止するランレベルにリンクを設定します。


systemdサービスとして

var / myappにインストールされたSpring Bootアプリケーションを実行するには、/ etc / systemd / system / myapp.serviceに次のスクリプトを追加できます。

[Unit]
Description=myapp
After=syslog.target

[Service]
ExecStart=/var/myapp/myapp.jar

[Install]
WantedBy=multi-user.target

注意:この方法を使用する場合は、jarファイル自体を実行可能にすることを忘れないでください(chmod + xを使用)。そうしないと、エラー「Permission denied」で失敗します。

参照

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/deployment-install.html#deployment-service


1
「完全に実行可能なJAR」アプローチはどのように機能しますか?CentOS 6.6を使用しています。に追加<executable>true</executable>しましたpom.xmlが、パッケージ化されたJARファイルが実行されません(...。./myapp.jar ... cannot execute binary file
Abdull

5
この回答は、現在リリースされていない現在の1.3マイルストーンでのみ機能します。1.1および1.2ブランチは、ここで他の応答を確認する必要があります。
2015年

6
-Dspring.profiles.active=prodこのサービスのような春の議論を渡す方法をみんな知っていますか?質問- stackoverflow.com/questions/31242291/...
nKognito

2
Spring-Bootアプリケーションを停止できません。/etc/init.d stopアプリを停止するのではなく、アプリを再起動しようとしています。
2016

2
プロセスを監視し、システムデーモンを作成せずに停止
2014/06/06 /…を

112

以下は、JavaのアプリケーションをLinuxのシステムサービスとしてインストールする最も簡単な方法です。

あなたが使っているとしましょうsystemd(最近のどのディストリビューションでも使われています):

まず、/etc/systemd/systemnamedなどのサービスファイルjavaservice.serviceを次の内容で作成します。

[Unit]
Description=Java Service

[Service]
User=nobody
# The configuration file application.properties should be here:
WorkingDirectory=/data 
ExecStart=/usr/bin/java -Xmx256m -jar application.jar --server.port=8081
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

次に、systemd新しいサービスファイルを通知します。

systemctl daemon-reload

有効にして、起動時に実行します。

systemctl enable javaservice.service

最終的に、次のコマンドを使用して新しいサービスを開始/停止できます。

systemctl start javaservice
systemctl stop javaservice
systemctl restart javaservice
systemctl status javaservice

を使用している場合systemd、これはJavaアプリケーションをシステムサービスとして設定するための最も邪魔にならないクリーンな方法です。

このソリューションで特に気に入っているのは、他のソフトウェアをインストールして構成する必要がないことです。出荷されたものsystemdはすべての作業を行い、サービスは他のシステムサービスと同じように動作します。私はしばらくの間、さまざまなディストリビューションで本番環境で使用していますが、期待どおりに機能します。

もう1つの/usr/bin/java利点は、を使用することで、jvmなどのパラメーターを簡単に追加できること-Xmx256mです。

また、systemdSpring Bootの公式ドキュメントの次の部分もお読みください。http//docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html


残念ながら、systemdは
Centos

どうやってそれを止める方法を知っていますか?pidを記録してからそれを殺しますか?
ミスト

2
Spring Boot 1.3以降では、完全に実行可能なwarファイルを生成できるので、java -jar ...ビットは必要ありません。そこでファイルの名前を使用するだけです。
Pierre Henry

1
完全なjavaコマンドラインを使用することをお勧めします。その方法で、jvmパラメータを追加できます。
yglodt 2016

1
適切なブートシーケンスのためにあなたがに発注文を追加したい場合があります[Unit]例えば、セクションAfter=mysql.serviceBefore=apache2.service
rustyx

57

また、サービスを簡単に制御するために使用できる非常に便利なデーモンであるsupervisordを使用することもできます。これらのサービスは、どのディレクトリのどのユーザーで何を実行するかなどを定義する単純な構成ファイルによって定義され、無数のオプションがあります。supervisordの構文は非常に単純なので、SysV initスクリプトを作成する代わりに非常に優れています。

ここでは、実行/制御しようとしているプログラムの単純な監視構成ファイルです。(これを/etc/supervisor/conf.d/yourapp.confに入れてください

/etc/supervisor/conf.d/yourapp.conf

[program:yourapp]
command=/usr/bin/java -jar /path/to/application.jar
user=usertorun
autostart=true
autorestart=true
startsecs=10
startretries=3
stdout_logfile=/var/log/yourapp-stdout.log
stderr_logfile=/var/log/yourapp-stderr.log

アプリケーションを制御するには、supervisorctlを実行する必要があります。これにより、yourappを開始、停止、ステータスできるプロンプトが表示されます。

CLI

# sudo supervisorctl
yourapp             RUNNING   pid 123123, uptime 1 day, 15:00:00
supervisor> stop yourapp
supervisor> start yourapp

場合はsupervisordデーモンがすでに実行されていると、あなたは簡単に行うことができますデーモン再起動することなく、あなたのserivceの設定を追加しましたrereadupdateでコマンドをsupervisorctlシェルを。

これにより、SysV Initスクリプトを使用する場合と同じように柔軟に使用および制御できるすべての柔軟性が実現します。ドキュメントをご覧ください。


最後に、箱から出してすぐに何かがうまくいきました。監督されたヒントをどうもありがとう。
Vitaly Sazanovich

これは、systemd最新のLinuxディストリビューションに組み込まれていると同じ働きをします。
rustyx

18

私はこれを自分でやってみたところです。CentOSのinit.dサービスコントローラースクリプトの観点から、これまでのところは次のとおりです。これまでのところかなりうまく機能していますが、私はBashのハッカーではないので、改善の余地があると確信しています。

まず、/data/svcmgmt/conf/my-spring-boot-api.sh各サービスに環境変数を設定する短い構成スクリプトがあります。

#!/bin/bash
export JAVA_HOME=/opt/jdk1.8.0_05/jre
export APP_HOME=/data/apps/my-spring-boot-api
export APP_NAME=my-spring-boot-api
export APP_PORT=40001

私はCentOSを使用しているため、サーバーの再起動後にサービスが確実に開始されるように、サービス制御スクリプトを/etc/init.d/my-spring-boot-api次の場所に置いています。

#!/bin/bash
# description: my-spring-boot-api start stop restart
# processname: my-spring-boot-api
# chkconfig: 234 20 80

. /data/svcmgmt/conf/my-spring-boot-api.sh

/data/svcmgmt/bin/spring-boot-service.sh $1

exit 0

ご覧のとおり、最初の構成スクリプトを呼び出して環境変数を設定してから、すべてのSpring Bootサービスを再起動するために使用する共有スクリプトを呼び出します。その共有スクリプトは、そのすべての要点を見つけることができる場所です。

#!/bin/bash

echo "Service [$APP_NAME] - [$1]"

echo "    JAVA_HOME=$JAVA_HOME"
echo "    APP_HOME=$APP_HOME"
echo "    APP_NAME=$APP_NAME"
echo "    APP_PORT=$APP_PORT"

function start {
    if pkill -0 -f $APP_NAME.jar > /dev/null 2>&1
    then
        echo "Service [$APP_NAME] is already running. Ignoring startup request."
        exit 1
    fi
    echo "Starting application..."
    nohup $JAVA_HOME/bin/java -jar $APP_HOME/$APP_NAME.jar \
        --spring.config.location=file:$APP_HOME/config/   \
        < /dev/null > $APP_HOME/logs/app.log 2>&1 &
}

function stop {
    if ! pkill -0 -f $APP_NAME.jar > /dev/null 2>&1
    then
        echo "Service [$APP_NAME] is not running. Ignoring shutdown request."
        exit 1
    fi

    # First, we will try to trigger a controlled shutdown using 
    # spring-boot-actuator
    curl -X POST http://localhost:$APP_PORT/shutdown < /dev/null > /dev/null 2>&1

    # Wait until the server process has shut down
    attempts=0
    while pkill -0 -f $APP_NAME.jar > /dev/null 2>&1
    do
        attempts=$[$attempts + 1]
        if [ $attempts -gt 5 ]
        then
            # We have waited too long. Kill it.
            pkill -f $APP_NAME.jar > /dev/null 2>&1
        fi
        sleep 1s
    done
}

case $1 in
start)
    start
;;
stop)
    stop
;;
restart)
    stop
    start
;;
esac
exit 0

停止すると、Spring Boot Actuatorを使用して制御されたシャットダウンを実行しようとします。ただし、Actuatorが構成されていないか、妥当な時間内にシャットダウンに失敗した場合(実際には少し短い5秒です)、プロセスは強制終了されます。

また、スクリプトは、appllicationを実行しているJavaプロセスが、プロセスの詳細のテキストに「my-spring-boot-api.jar」がある唯一のプロセスであると想定しています。これは私の環境では安全な前提であり、PIDを追跡する必要がないことを意味します。


3
独自の開始/停止スクリプトを記述する必要はありません。これは、Spring Boot 1.3以降で提供されます。詳細については、docs.spring.io / spring-boot / docs / current / reference / htmlsingle /…を参照してください。
gregturn

これはオプションであることを知っておくと便利ですが、それを行うには、を使用して実行する必要がなくなりjava -jarます。スクリプトの残りの部分はまだ必要です。
Steve

/etc/init.dまたはsystemdがオプションではない場合に、共有してくれてありがとう。
2016年

@Steve:いいえ。あなたは車輪を再発明しています。ああ、そして私たちは今体系化しました。
MartinSchröder2016

JVMにパラメーターを渡す必要がある場合(-javaagentや-Dパラメーターなど)、これはユニークな方法です。tks@Steve!
Dyorgio 2017

14

Spring Boot 1.2.5をSpring Boot Mavenプラグイン1.3.0.M2で使用する場合は、次の解決策があります。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.5.RELEASE</version>
</parent>

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

<pluginRepositories>
    <pluginRepository>
        <id>spring-libs-milestones</id>
        <url>http://repo.spring.io/libs-milestone</url>
    </pluginRepository> 
</pluginRepositories>

次に、ususalとしてコンパイルします。mvn clean package、シンボリックリンクln -s /.../myapp.jar /etc/init.d/myappを作成し、実行可能にchmod +x /etc/init.d/myappして起動しますservice myapp start(Ubuntuサーバーを使用)。


実行可能なWARファイルはどうですか?WARレイアウトでは機能しません。
Radu Toader、2015年

興味深いことに、これはリリース1.3.0.M2で機能しますが、試したところエラーが発生しました1.3.0.RC1
JBCP、2015年

Mavenの代わりにgradleを使用してこれを行う方法についてのアイデアはありますか?
Geir 2015年

Gradleを使用する場合、この構成はspringBoot { executable = true }ブロックを使用して行われます。
Natix 2017年

@RaduToader:WARファイルをサービスとして実行できましたか?
naveenkumarbv

9

これは古い質問であることはわかっていますが、appassembler-maven-pluginであるもう1つの方法を提示したいと思います。これは、POMの関連部分であり、有用であることが判明した多くの追加オプション値が含まれています。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>appassembler-maven-plugin</artifactId>
    <configuration>
        <generateRepository>true</generateRepository>
        <repositoryLayout>flat</repositoryLayout>
        <useWildcardClassPath>true</useWildcardClassPath>
        <includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath>
        <configurationDirectory>config</configurationDirectory>
        <target>${project.build.directory}</target>
        <daemons>
            <daemon>
                <id>${installer-target}</id>
                <mainClass>${mainClass}</mainClass>
                <commandLineArguments>
                    <commandLineArgument>--spring.profiles.active=dev</commandLineArgument>
                    <commandLineArgument>--logging.config=${rpmInstallLocation}/config/${installer-target}-logback.xml</commandLineArgument>
                </commandLineArguments>
                <platforms>
                    <platform>jsw</platform>
                </platforms>
                <generatorConfigurations>
                    <generatorConfiguration>
                        <generator>jsw</generator>
                        <includes>
                            <include>linux-x86-64</include>
                        </includes>
                        <configuration>
                            <property>
                                <name>wrapper.logfile</name>
                                <value>logs/${installer-target}-wrapper.log</value>
                            </property>
                            <property>
                                <name>wrapper.logfile.maxsize</name>
                                <value>5m</value>
                            </property>
                            <property>
                                <name>run.as.user.envvar</name>
                                <value>${serviceUser}</value>
                            </property>
                            <property>
                                <name>wrapper.on_exit.default</name>
                                <value>RESTART</value>
                            </property>
                        </configuration>
                    </generatorConfiguration>
                </generatorConfigurations>
                <jvmSettings>
                    <initialMemorySize>256M</initialMemorySize>
                    <maxMemorySize>1024M</maxMemorySize>
                    <extraArguments>
                        <extraArgument>-server</extraArgument>
                    </extraArguments>
                </jvmSettings>
            </daemon>
        </daemons>
    </configuration>
    <executions>
        <execution>
            <id>generate-jsw-scripts</id>
            <phase>package</phase>
            <goals>
                <goal>generate-daemons</goal>
            </goals>
        </execution>
    </executions>
</plugin>

6

WINDOWSサービスとして

これをWindowsマシンで実行したい場合は、winsw.exeをダウンロードしてください

 http://repo.jenkins-ci.org/releases/com/sun/winsw/winsw/2.1.2/

その後、名前をjarファイル名に変更します(例:your-app .jar)

winsw.exe -> your-app.exe

次に、xmlファイルyour-app.xmlを作成し、以下のコンテンツをそのファイルにコピーします

<?xml version="1.0" encoding="UTF-8"?>
<service>
     <id>your-app</id>
     <name>your-app</name>
     <description>your-app as a Windows Service</description>
     <executable>java</executable>
     <arguments>-jar "your-app.jar"</arguments>
     <logmode>rotate</logmode>
</service>

ことを確認してexeファイルXMLと一緒にjarファイルと同じフォルダにあります。

Administratorでこのコマンドプロンプトを開いた後、Windowsサービスにインストールしてインストールします。

your-app.exe install
eg -> D:\Springboot\your-app.exe install

それが失敗した場合

Error: Registry key 'Software\JavaSoft\Java Runtime Environment'\CurrentVersion' has value '1.8', but '1.7' is required.

次に、以下を試してください。

Delete java.exe, javaw.exe and javaws.exe from C:\Windows\System32

それでおしまい :) 。

Windowsでサービスをアンインストールするには

your-app.exe uninstall

サービスの表示/実行/停止の場合: win + rと入力して「管理ツール」と入力し、そこからサービスを選択します。次に右クリックしオプションを選択します-実行/停止


Spring Boot jarを会社のイントラネット環境でWindowsサービスとして実行するのと同じ手順に従いましたが、サービスが起動していません。次のエラーでウィンドウが表示されます:エラー:1067プロセスが予期せず終了しました。
Nikhil Singh Bhadoriya

あなたはそれをするすべての許可を持っていますか?あなたが管理者であれば、これは問題を引き起こしません。管理者権限があることを確認してください。
Arundev

stackoverflow.com/questions/18205111/…問題を解決するのに役立つ可能性があるので、試してみてください。
Arundev

迅速な対応に感謝し、xmlファイルのタグの問題を修正することで、サービスを稼働させました。
Nikhil Singh Bhadoriya

4

Centos 6 / RHEL用のSysVInitスクリプト(まだ理想的ではありません)。このスクリプトにはApplicationPidListenerが必要です。

のソース /etc/init.d/app

#!/bin/sh
#
# app Spring Boot Application 
#
# chkconfig:   345 20 80
# description: App Service
#           

### BEGIN INIT INFO
# Provides: App
# Required-Start: $local_fs $network
# Required-Stop: $local_fs $network
# Default-Start: 3 4 5 
# Default-Stop: 0 1 2 6
# Short-Description: Application
# Description:      
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

exec="/usr/bin/java"
prog="app"
app_home=/home/$prog/
user=$prog

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

lockfile=/var/lock/subsys/$prog    
pid=$app_home/$prog.pid

start() {

    [ -x $exec ] || exit 5
    [ -f $config ] || exit 6
    # Check that networking is up.
    [ "$NETWORKING" = "no" ] && exit 1
    echo -n $"Starting $prog: "
    cd $app_home
    daemon --check $prog --pidfile $pid --user $user $exec $app_args &
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc -p $pid $prog
    retval=$?
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    stop
    start
}

reload() {
    restart
}

force_reload() {
    restart
}

rh_status() {
    status -p $pid $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
        restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
        exit 2
esac
exit $?

サンプル構成ファイル/etc/sysconfig/app

exec=/opt/jdk1.8.0_05/jre/bin/java

user=myuser
app_home=/home/mysuer/

app_args="-jar app.jar"

pid=$app_home/app.pid

4

以下は、実行可能なjarをsystemdサービスとしてデプロイするスクリプトです。

サービスと.serviceファイルのユーザーを作成し、jarファイルを/ varの下に配置して、特権の基本的なロックダウンを行います。

#!/bin/bash

# Argument: The jar file to deploy
APPSRCPATH=$1

# Argument: application name, no spaces please, used as folder name under /var
APPNAME=$2

# Argument: the user to use when running the application, may exist, created if not exists
APPUSER=$3

# Help text
USAGE="
Usage: sudo $0 <jar-file> <app-name> <runtime-user>
If an app with the name <app-name> already exist, it is stopped and deleted.
If the <runtime-user> does not already exist, it is created.
"

# Check that we are root
if [ ! "root" = "$(whoami)" ]; then
    echo "Must be root. Please use e.g. sudo"
    echo "$USAGE"
    exit
fi

# Check arguments
if [ "$#" -ne 3 -o ${#APPSRCPATH} = 0 -o ${#APPNAME} = 0 -o ${#APPUSER} = 0 ]; then
    echo "Incorrect number of parameters."
    echo "$USAGE"
    exit
fi

if [ ! -f $APPSRCPATH ]; then
    echo "Can't find jar file $APPSRCPATH"
    echo "$USAGE"
    exit
fi

# Infered values
APPFILENAME=$(basename $APPSRCPATH)
APPFOLDER=/var/javaapps/$APPNAME
APPDESTPATH=$APPFOLDER/$APPFILENAME

# Stop the service if it already exist and is running
systemctl stop $APPNAME >/dev/null 2>&1

# Create the app folder, deleting any previous content
rm -fr $APPFOLDER
mkdir -p $APPFOLDER

# Create the user if it does not exist
if id "$APPUSER" >/dev/null 2>&1; then
    echo "Using existing user $APPUSER"
else
    adduser --disabled-password --gecos "" $APPUSER
    echo "Created user $APPUSER"
fi

# Place app in app folder, setting owner and rights
cp $APPSRCPATH $APPDESTPATH
chown $APPUSER $APPDESTPATH
chmod 500 $APPDESTPATH
echo "Added or updated the $APPDESTPATH file"

# Create the .service file used by systemd
echo "
[Unit]
Description=$APPNAME
After=syslog.target
[Service]
User=$APPUSER
ExecStart=/usr/bin/java -jar $APPDESTPATH
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
" > /etc/systemd/system/$APPNAME.service
echo "Created the /etc/systemd/system/$APPNAME.service file"

# Reload the daemon
systemctl daemon-reload

# Start the deployed app
systemctl start $APPNAME
systemctl status $APPNAME

例: ここに画像の説明を入力してください


4

末尾に圧縮されたJavaアプリケーションが付加された「init.d」スタイルのシェルスクリプトとして表示されるSpringBootアプリケーションを作成しようとしています

これらのスクリプトを/etc/init.d/spring-appから/opt/spring-app.jarにシンボリックリンクし、jarを実行可能にchmodすることで、 "/ etc / init.d / spring-app start "" /etc/init.d/spring-app stop "とステータス作業のような他の可能性

おそらく、springbootのinit.dスタイルのスクリプトは必要なマジック文字列(など# Default-Start: 2 3 4 5)を持っているように見えるので、chkconfigはそれを「サービス」として追加できます。

しかし、私はそれをsystemdで動作させたいと思っていました

この作業を行うために、上記の他の回答で多くのレシピを試しましたが、Centos 7.2(Springboot 1.3)では、どれもうまくいきませんでした。ほとんどはサービスを開始しましたが、pidを追跡できませんでした

最終的に、/ etc / init.dリンクも配置されていたときに、次のことが機能することがわかりました。以下のようなファイルをインストールする必要があります/usr/lib/systemd/system/spring-app.service

[Unit]
Description=My loverly application
After=syslog.target 

[Service]
Type=forking
PIDFile=/var/run/spring-app/spring-app.pid
ExecStart=/etc/init.d/spring-app start
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

4

WAR / JARレイアウトのsystemdサービスを実行してしまいました

java -jarと呼んでいるのは、その柔軟性が高いためです。ExecStart = spring-mvc.warも入れてみましたが、実行可能ですが、「Exec形式エラー」が発生しました

とにかく、最近、systemdはすべてのディストリビューションに存在し、ログをリダイレクトするための優れたソリューションを提供します(サービスが開始しない場合でも、syserrは重要ですlog4jファイルの場所は空になります:))。

cat /etc/systemd/system/spring-mvc.service 
[Unit]
Description=Spring MVC Java Service

[Service]
User=spring-mvc
# The configuration file application.properties should be here:
WorkingDirectory=/usr/local/spring-mvc


# Run ExecStartPre with root-permissions
PermissionsStartOnly=true

ExecStartPre=-/bin/mkdir -p /var/log/spring-mvc


ExecStartPre=/bin/chown -R spring-mvc:syslog /var/log/spring-mvc
ExecStartPre=/bin/chmod -R 775 /var/log/spring-mvc



#https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart=
ExecStart=/usr/bin/java \
        -Dlog4j.configurationFile=log4j2-spring.xml \
        -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector \
        -Dspring.profiles.active=dev \
        -Denvironment-type=dev \
        -XX:+UseConcMarkSweepGC \
        -XX:CMSInitiatingOccupancyFraction=80 \
        -XX:NewSize=756m \
        -XX:MetaspaceSize=256m \
        -Dsun.net.inetaddr.ttl=5 \
        -Xloggc:/var/log/spring-mvc/gc.log \
        -verbose:gc \
        -verbosegc \
        -XX:+DisableExplicitGC \
        -XX:+PrintGCDetails \
        -XX:+PrintGCDateStamps \
        -XX:+PreserveFramePointer \
        -XX:+StartAttachListener \
        -Xms1024m \
        -Xmx1024m \
        -XX:+HeapDumpOnOutOfMemoryError \
        -jar spring-mvc.war

SuccessExitStatus=143
StandardOutput=journal
StandardError=journal


KillSignal=SIGINT
TimeoutStopSec=20
Restart=always
RestartSec=5
StartLimitInterval=0
StartLimitBurst=10

LimitNOFILE=500000
LimitNPROC=500000

#https://www.freedesktop.org/software/systemd/man/systemd.exec.html#LimitCPU=
#LimitCPU=, LimitFSIZE=, LimitDATA=, LimitSTACK=, LimitCORE=, LimitRSS=, LimitNOFILE=, LimitAS=, LimitNPROC=, LimitMEMLOCK=, LimitLOCKS=, LimitSIGPENDING=, LimitMSGQUEUE=, LimitNICE=, LimitRTPRIO=, LimitRTTIME=¶

SyslogIdentifier=spring-mvc

[Install]
WantedBy=multi-user.target


# https://www.freedesktop.org/software/systemd/man/journalctl.html
#check logs --- journalctl -u spring-mvc -f -o cat

rsyslog-syslog入力をアプリから特定のフォルダー/ファイルにリダイレクトする

cat /etc/rsyslog.d/30-spring-mvc.conf 
if $programname == 'spring-mvc' then /var/log/spring-mvc/spring-mvc.log
& stop

logrotate

cat /etc/logrotate.d/spring-mvc.conf 
/var/log/spring-mvc/spring-mvc.log
{
    daily
    rotate 30
    maxage 30
    copytruncate
    missingok
    notifempty
    compress
    dateext
    dateformat _%Y-%m-%d_%H-%M
    delaycompress
    create 644 spring-mvc syslog
    su spring-mvc syslog
}

logrotate gc

cat /etc/logrotate.d/spring-mvc-gc.conf 
/var/log/spring-mvc/gc.log
{
    daily
    rotate 30
    maxage 30
    copytruncate
    missingok
    notifempty
    compress
    dateext
    dateformat _%Y-%m-%d_%H-%M
    delaycompress
    create 644 spring-mvc syslog
    su spring-mvc syslog
}

3

この質問では、@ PbxManからの回答で開始できます。

LinuxでJavaアプリケーションをサービスとして実行する

編集:

cronを使用して、再起動時にプロセスを開始する、あまり良くない別の方法があります。

@reboot user-to-run-under /usr/bin/java -jar /path/to/application.jar

これは機能しますが、アプリケーションに適切な開始/停止インターフェイスを提供しません。killとにかくそれを簡単にできます...


Spring Bootはこれを行うための特別な機能を提供しているためです。
トリスタン

2

Javaアプリでこれを行う「標準」のシュリンクラップされた方法は知りませんが、それは間違いなく良いアイデアです(オペレーティングシステムが存在する場合は、キープアライブ機能とオペレーティングシステムの監視機能を活用したい)。 。Spring Bootツールのサポート(mavenとgradle)から何かを提供することはロードマップにありますが、今のところ、おそらく自分でロールする必要があります。私が今知っている最良のソリューションはForemanです。これは、宣言型のアプローチと、さまざまな標準OS形式(monit、sys V、upstartなど)のinitスクリプトをパッケージ化するための1行のコマンドを備えています。人々がgradleを使ってセットアップしたという証拠もあります(例:ここ)。


2

Mavenを使用していますか?次に、AppAssemblerプラグインを試す必要があります。

Application Assembler Pluginは、Javaアプリケーションを起動するためのスクリプトを生成するためのMavenプラグインです。...すべてのアーティファクト(依存関係+プロジェクトのアーティファクト)が、生成されたbinスクリプトのクラスパスに追加されます。

サポートされるプラットフォーム:

Unixバリアント

Windows NT(Windows 9xはサポートされていません)

Java Service Wrapper(JSW)

参照:http : //mojo.codehaus.org/appassembler/appassembler-maven-plugin/index.html


2

Spring Bootプロジェクトのbuild.gradleファイルには、次の構成が必要です。

build.gradle

jar {
    baseName = 'your-app'
    version = version
}

springBoot {
    buildInfo()
    executable = true   
    mainClass = "com.shunya.App"
}

実行可能= true

これは、UNIXシステム(CentosおよびUbuntu)で完全に実行可能なjarを作成するために必要です。

.confファイルを作成する

カスタムJVMプロパティまたはSpring Bootアプリケーション実行引数を構成する場合は、Spring Bootアプリケーション名と同じ名前の.confファイルを作成して、jarファイルと並行に配置できます。

your-app.jarがSpring Bootアプリケーションの名前であることを考慮して、次のファイルを作成できます。

JAVA_OPTS="-Xms64m -Xmx64m"
RUN_ARGS=--spring.profiles.active=prod
LOG_FOLDER=/custom/log/folder

この構成では、Spring Bootアプリケーションに64 MBのRAMを設定し、prodプロファイルをアクティブ化します。

Linuxで新しいユーザーを作成する

セキュリティを強化するには、Spring Bootアプリケーションをサービスとして実行する特定のユーザーを作成する必要があります。

新しいユーザーを作成する

sudo useradd -s /sbin/nologin springboot

Ubuntu / Debianでは、上記のコマンドを次のように変更します。

sudo useradd -s /usr/sbin/nologin springboot

パスワードを設定してください

sudo passwd springboot

SpringBootを実行可能ファイルの所有者にする

chown springboot:springboot your-app.jar

jarファイルの変更を防止

chmod 500 your-app.jar

これにより、jarの権限が構成され、書き込みができず、所有者のSpringbootだけが読み取りまたは実行できるようになります。

オプションで、属性変更(chattr)コマンドを使用して、jarファイルを不変にできます。

sudo chattr +i your-app.jar

対応する.confファイルにも適切な権限を設定する必要があります。.confには、読み取り+実行(オクタル500)アクセスではなく、読み取りアクセス(オクタル400)のみが必要です。

chmod 400 your-app.conf

Systemdサービスを作成する

/etc/systemd/system/your-app.service

[Unit]
Description=Your app description
After=syslog.target

[Service]
User=springboot
ExecStart=/var/myapp/your-app.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

OSによって強制終了された場合、プロセスを自動的に再起動します

以下の2つの属性(RestartおよびRestartSec)を追加して、障害時にプロセスを自動的に再起動します。

/etc/systemd/system/your-app.service

[Service]
User=springboot
ExecStart=/var/myapp/your-app.jar
SuccessExitStatus=143
Restart=always
RestartSec=30

この変更により、障害が発生した場合に30秒の遅延でSpring Bootアプリケーションが再起動します。systemctlコマンドを使用してサービスを停止すると、再起動は行われません。

システム起動時にサービスをスケジュールする

システムの起動時にアプリケーションが自動的に起動するようにフラグを設定するには、次のコマンドを使用します。

システムの起動時にSpring Bootアプリケーションを有効にする

sudo systemctl enable your-app.service

サービスの開始と停止

systemctlは、Ubuntu 16.04 LTSおよび18.04 LTSでプロセスを開始および停止するために使用できます。

プロセスを開始する

sudo systemctl start your-app

プロセスを停止する

sudo systemctl stop your-app

参考文献

https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html


1

「エラー:メインクラスが見つからないか、ロードできませんでした」というエラーが表示され、Javaアプリを起動するシェルスクリプトを実行するか、Javaアプリを起動するかにかかわらず、トラブルシューティングに数時間を費やした場合のチャドの優れた回答のフォローアップsystemd自体から-そして、クラスパスが100%正しいことを知っています。たとえば、手動でシェルスクリプトを実行すると、systemd execstartにあるものを実行できます。 正しいユーザーとして実行ていること確認してください!私の場合、かなりのトラブルシューティングの後、別のユーザーを試してみました-ようやく直感を得て、ユーザーとしてrootを置きました-ほら、アプリは正しく起動しました。ユーザーの問題が間違っていると判断した後、chown -R user:user フォルダーとサブフォルダー、およびアプリは指定されたユーザーとグループとして正しく実行されたため、ルートとして実行する必要はなくなりました(セキュリティが悪い)。


1

systemdユニットファイルでは、環境変数ディレクトリまたはを介して環境変数を設定できますEnvironmentFile。摩擦が最も少ないように思われるので、私はこのようにすることを提案します。

サンプルユニットファイル

$ cat /etc/systemd/system/hello-world.service
[Unit]
Description=Hello World Service
After=systend-user-sessions.service

[Service]
EnvironmentFile=/etc/sysconfig/hello-world
Type=simple
ExecStart=/usr/bin/java ... hello-world.jar

次に/etc/sysconfig/hello-world、Spring Boot変数の大文字の名前を含むファイルを設定します。たとえば、呼び出される変数は、環境変数としてserver.portの形式に従いSERVER_PORTます。

$ cat /etc/sysconfig/hello-world
SERVER_PORT=8081

ここで利用されているメカニズムは、Spring Bootアプリケーションがプロパティのリストを取得してそれらを変換し、すべてを大文字にして、ドットをアンダースコアに置き換えることです。Spring Bootアプリはこのプロセスを実行すると、一致する環境変数を探し、それに応じて見つかったものを使用します。

これは、このSO Q&Aというタイトルの詳細で強調されています:環境変数を使用して、名前にアンダースコアを含むSpring Bootプロパティを設定するにはどうすればよいですか?

参考文献



1

your-app.service(rest-app.service)という名前のスクリプトを作成します。このスクリプトを/ etc / systemd / systemディレクトリに配置する必要があります。スクリプトのサンプルコンテンツは次のとおりです

[Unit]
Description=Spring Boot REST Application
After=syslog.target

[Service]
User=javadevjournal
ExecStart=/var/rest-app/restdemo.jar
SuccessExitStatus=200

[Install]
WantedBy=multi-user.target

次:

 service rest-app start

参考文献

ここにリンクの説明を入力


これは同じように見えます-> stackoverflow.com/a/30497095/516167
MariuszS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.