wake-up-neo.com

Spring Boot-Anwendung als Dienst

Wie konfiguriere ich eine Spring Boot-Anwendung, die als ausführbares jar as a Service in einem Linux-System gepackt ist? Ist dies ein empfohlener Ansatz, oder sollte ich diese App in War konvertieren und in Tomcat installieren?

Derzeit kann ich Spring Boot-Anwendung von screen Sitzung ausführen, was nett ist, aber erfordert manuellen Start nach dem Neustart des Servers.

Was ich suche, ist allgemeiner Rat/Richtung oder Probe init.d script, wenn mein Ansatz mit executable jar richtig ist.

171
MariuszS

Was folgt, ist der einfachste Weg, eine Java) - Anwendung als Systemdienst unter Linux zu installieren.

Nehmen wir an, Sie verwenden systemd (was heutzutage jede moderne Distribution tut):

Erstellen Sie zunächst eine Servicedatei in /etc/systemd/system genannt z.B. javaservice.service mit diesem Inhalt:

[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

Benachrichtigen Sie zweitens systemd über die neue Servicedatei:

systemctl daemon-reload

und aktivieren Sie es, damit es beim Booten ausgeführt wird:

systemctl enable javaservice.service

Schließlich können Sie die folgenden Befehle verwenden, um Ihren neuen Dienst zu starten/zu beenden:

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

Vorausgesetzt, Sie verwenden systemd, ist dies die unauffälligste und sauberste Methode, um eine Java) - Anwendung als Systemdienst einzurichten.

Was mir an dieser Lösung besonders gefällt, ist die Tatsache, dass Sie keine andere Software installieren und konfigurieren müssen. Der ausgelieferte systemd erledigt die gesamte Arbeit für Sie und Ihr Dienst verhält sich wie jeder andere Systemdienst. Ich benutze es für eine Weile in der Produktion, in verschiedenen Distributionen, und es funktioniert genauso, wie Sie es erwarten würden.

Ein weiteres Plus ist, dass mit /usr/bin/Java können Sie einfach jvm Parameter wie -Xmx256m.

Lesen Sie auch den Teil systemd in der offiziellen Spring Boot-Dokumentation: http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html =

94
yglodt

Sie können auch supervisord verwenden, einen sehr praktischen Daemon, mit dem Sie Dienste einfach steuern können. Diese Dienste werden durch einfache Konfigurationsdateien definiert, die definieren, was mit welchem ​​Benutzer in welchem ​​Verzeichnis ausgeführt werden soll, und so weiter. Es gibt unzählige Optionen. supervisord hat eine sehr einfache Syntax und ist daher eine sehr gute Alternative zum Schreiben von SysV-Init-Skripten.

Hier eine einfache Supervisord-Konfigurationsdatei für das Programm, das Sie ausführen/steuern möchten. (Setzen Sie dies in /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

Um die Anwendung zu steuern, müssten Sie supervisorctl ausführen, das Ihnen eine Eingabeaufforderung anzeigt, mit der Sie Ihre Anwendung starten, stoppen und den Status Ihrer Anwendung festlegen können.

CLI

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

Wenn der Dämon supervisord bereits ausgeführt wird und Sie die Konfiguration für Ihren Dienst hinzugefügt haben, ohne den Dämon neu zu starten, können Sie einfach einen Befehl reread und update in supervisorctl Shell.

Dies gibt Ihnen wirklich alle Möglichkeiten, die Sie mit SysV Init-Skripten hätten, aber einfach zu bedienen und zu kontrollieren. Schauen Sie sich die Dokumentation an.

52
flazzarini

Ich habe mich gerade selbst darum gekümmert, und im Folgenden bin ich in Bezug auf ein CentOS init.d-Dienststeuerungsskript soweit. Bisher funktioniert es recht gut, aber ich bin kein Leet-Bash-Hacker, daher bin ich mir sicher, dass es Raum für Verbesserungen gibt. Überlegungen zur Verbesserung sind daher willkommen.

Zuallererst habe ich ein kurzes Konfigurationsskript /data/svcmgmt/conf/my-spring-boot-api.sh für jeden Dienst, der Umgebungsvariablen einrichtet.

#!/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

Ich verwende CentOS. Um sicherzustellen, dass meine Dienste nach einem Serverneustart gestartet werden, habe ich ein Dienststeuerungsskript in /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

Wie Sie sehen, ruft dies das anfängliche Konfigurationsskript zum Einrichten von Umgebungsvariablen auf und ruft dann ein freigegebenes Skript auf, mit dem ich alle meine Spring Boot-Dienste neu starte. In diesem gemeinsamen Skript befindet sich das Fleisch von allem:

#!/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

Beim Anhalten wird versucht, mit Spring Boot Actuator eine kontrollierte Abschaltung durchzuführen. Falls Actuator jedoch nicht konfiguriert ist oder nicht innerhalb eines angemessenen Zeitraums heruntergefahren werden kann (ich gebe ihm 5 Sekunden, was wirklich ein bisschen kurz ist), wird der Prozess abgebrochen.

Außerdem geht das Skript davon aus, dass der Java) - Prozess, auf dem die Anwendung ausgeführt wird, der einzige ist, der im Text der Prozessdetails "my-spring-boot-api.jar" enthält eine sichere Annahme in meiner Umgebung und bedeutet, dass ich PIDs nicht nachverfolgen muss.

16
Steve

Wenn Sie Spring Boot 1.2.5 mit Spring Boot Maven Plugin 1.3.0.M2 verwenden möchten, sehen Sie sich die folgende Lösung an:

<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>

Dann kompiliere wie üblich: mvn clean package, mache einen Symlink ln -s /.../myapp.jar /etc/init.d/myapp, mach es ausführbar chmod +x /etc/init.d/myapp und starte es service myapp start (mit Ubuntu Server)

13
Benjamin M

Ich weiß, dass dies eine ältere Frage ist, aber ich wollte noch einen anderen Weg vorstellen, nämlich das Appassembler-Maven-Plugin . Hier ist der relevante Teil aus meinem POM, der viele zusätzliche Optionswerte enthält, die wir als nützlich empfanden:

<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>
8
voor

ALS WINDOWS-SERVICE

Wenn dies unter Windows ausgeführt werden soll, laden Sie die Datei winsw.exe von herunter

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

Danach benenne es um in jar filename (zB: your-app. Jar)

winsw.exe -> your-app.exe

Erstellen Sie nun eine XML-Datei your-app.xml und kopieren Sie den folgenden Inhalt in diese Datei

<?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>

Stellen Sie sicher, dass sich exe und xml zusammen mit jar in demselben Ordner befinden.

Öffnen Sie danach Eingabeaufforderung in Administrator-Berechtigung und installieren Sie es auf dem Windows-Dienst.

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

Wenn es mit scheitert

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

Dann versuchen Sie folgendes:

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

das ist es :) .

So deinstallieren Sie den Dienst in Windows

your-app.exe uninstall

Zum Anzeigen/Ausführen/Beenden des Dienstes: win + r und geben Sie Verwaltung ein, und wählen Sie dann Dienst aus. Dann Rechtsklick wählen Sie die Option - Ausführen/Stoppen

4
Arundev

Mein SysVInit-Skript für Centos 6/RHEL (noch nicht ideal). Dieses Skript benötigt ApplicationPidListener .

Quelle von /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 $?

Beispielkonfigurationsdatei /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
3
MariuszS

Ich versuche, Springboot-Anwendungen zu erstellen, die als Shell-Skript im "init.d" -Stil mit einer komprimierten Java) -Anwendung dargestellt werden, die am Ende angeheftet ist

Durch das Verknüpfen dieser Skripte von /etc/init.d/spring-app mit /opt/spring-app.jar und das Ändern der Ausführbarkeit der JAR-Datei ist es möglich, "/etc/init.d/spring-app" zu starten "" /etc/init.d/spring-app stop "" und andere Möglichkeiten wie Status arbeiten

Da die Skripte im init.d-Stil von springboot die erforderlichen magischen Zeichenfolgen (wie # Default-Start: 2 3 4 5) Aufweisen, könnte chkconfig sie vermutlich als "Dienst" hinzufügen.

Aber ich wollte, dass es mit systemd funktioniert

Damit dies funktioniert, habe ich viele der Rezepte in den anderen Antworten oben ausprobiert, aber keiner von ihnen hat bei mir funktioniert auf Centos 7.2 mit Springboot 1.3 Meistens haben sie den Dienst gestartet, konnten aber die PID nicht nachverfolgen

Am Ende fand ich, dass das Folgende für mich funktioniert hat, als der Link /etc/init.d ebenfalls vorhanden war. Eine Datei ähnlich der folgenden sollte als /usr/lib/systemd/system/spring-app.service Installiert werden.

[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
3
Vorsprung

Hier ist ein Skript, das eine ausführbare JAR-Datei als systemd-Dienst bereitstellt.

Es erstellt einen Benutzer für den Dienst und die .service-Datei, legt die JAR-Datei unter/var ab und sperrt einige grundlegende Berechtigungen.

#!/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

Beispiel: enter image description here

3
User0

In dieser Frage sollten Sie mit der Antwort von @PbxMan beginnen:

Führen Sie eine Java Application as a Service unter Linux aus

Bearbeiten:

Es gibt eine andere, weniger gute Möglichkeit, einen Prozess beim Neustart mit cron zu starten:

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

Dies funktioniert, bietet jedoch keine nette Start-/Stopp-Schnittstelle für Ihre Anwendung. Sie können es trotzdem einfach kill ...

2
yglodt

Am Ende habe ich systemd service für das WAR/JAR-Layout ausgeführt

Ich rufe Java -jar auf, weil es flexibler ist. Versucht, auch ExecStart = spring-mvc.war zu setzen, aber obwohl es ausführbar ist, habe ich den Fehler 'Exec format error'

Heutzutage ist systemd in allen Distributionen vorhanden und bietet eine gute Lösung zum Umleiten von Protokollen (syserr ist wichtig, wenn Sie den Dienst nicht einmal starten, wird der Speicherort der log4j-Datei leer sein :)).

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 - Leitet Syslog-Eingaben von der App in einen bestimmten Ordner/eine bestimmte Datei um

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

logrotieren

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
}
2
Radu Toader

Ich kenne keine "Standard" -Methode, um dies mit einer Java App zu tun, aber es ist definitiv eine gute Idee (Sie möchten von den Keep-Alive- und Überwachungsfunktionen profitieren) Es steht auf der Roadmap, etwas von der Unterstützung für das Spring Boot-Tool (Maven und Gradle) bereitzustellen, aber im Moment müssen Sie wahrscheinlich Ihre eigene Version erstellen. Die beste Lösung, die ich kenne jetzt ist Foreman , das einen deklarativen Ansatz und einzeilige Befehle zum Packen von Init-Skripten für verschiedene Standard-Betriebssystemformate (monit, sys V, upstart usw.) hat mit gradle (zB hier ).

1
Dave Syer

Verwenden Sie Maven? Dann sollten Sie das AppAssembler Plugin ausprobieren:

Das Application Assembler Plugin ist ein Maven-Plugin zum Generieren von Skripten zum Starten von Java Anwendungen. ... Alle Artefakte (Abhängigkeiten + das Artefakt aus dem Projekt) werden dem Klassenpfad in den generierten Bin-Skripten hinzugefügt.

Unterstützte Plattformen:

Unix-Varianten

Windows NT (Windows 9x wird NICHT unterstützt)

Java Service Wrapper (JSW)

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

1
d0x

In System-Unit-Dateien können Sie das Verzeichnis der Umgebungsvariablen oder ein EnvironmentFile festlegen. Ich würde vorschlagen, die Dinge so zu machen, da es die geringste Reibung zu sein scheint.

Beispieleinheitendatei

$ 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

Richten Sie dann unter /etc/sysconfig/hello-world Eine Datei ein, die Großbuchstaben Ihrer Spring Boot-Variablen enthält. Eine Variable mit dem Namen server.port Würde beispielsweise der Form SERVER_PORT Als Umgebungsvariable folgen:

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

Der Mechanismus, der hier ausgenutzt wird, besteht darin, dass Spring Boot-Anwendungen die Liste der Eigenschaften übernehmen und sie dann übersetzen, indem sie alles in Großbuchstaben schreiben und Punkte durch Unterstriche ersetzen. Sobald die Spring Boot-App diesen Prozess durchlaufen hat, sucht sie nach übereinstimmenden Umgebungsvariablen und verwendet alle entsprechend gefundenen.

Dies wird in diesem Abschnitt SO F & A mit dem Titel: So legen Sie eine Spring Boot-Eigenschaft mit einem Unterstrich im Namen über Umgebungsvariablen fest? ausführlicher hervorgehoben

Verweise

0
slm

Verfolgen Sie die ausgezeichnete Antwort von Chad, wenn Sie den Fehler "Fehler: Hauptklasse konnte nicht gefunden oder geladen werden" - erhalten und ein paar Stunden damit verbringen, Fehler zu beheben, ob Sie ein Shell-Skript ausführen, das startet Ihre Java App oder startet sie von systemd selbst - und Sie wissen, dass Ihr Klassenpfad zu 100% korrekt ist, zB funktioniert das manuelle Ausführen des Shell-Skripts genauso wie das Ausführen dessen, was Sie in systemd execstart haben. - Seien Sie sicher Sie führen die Dinge als der richtige Benutzer aus! In meinem Fall hatte ich nach einer Weile der Fehlerbehebung verschiedene Benutzer ausprobiert - ich hatte schließlich eine Ahnung, als Benutzer root zu setzen - voila, die App Nachdem festgestellt wurde, dass es sich um ein falsches Benutzerproblem handelt, habe ich chown -R user:user Der Ordner und die Unterordner sowie die App wurden ordnungsgemäß als der angegebene Benutzer und die angegebene Gruppe ausgeführt, sodass sie nicht mehr als Root ausgeführt werden müssen (schlechte Sicherheit).

0
JGlass

Dies kann mit dem Systemd-Dienst in Ubuntu geschehen

[Unit]
Description=A Spring Boot application
After=syslog.target

[Service]
User=baeldung
ExecStart=/path/to/your-app.jar SuccessExitStatus=143

[Install] 
WantedBy=multi-user.target

Sie können diesem Link folgen, um eine detailliertere Beschreibung und verschiedene Möglichkeiten zu erhalten. http://www.baeldung.com/spring-boot-app-as-a-service

0
mujeeb rahman