IT

Spring Boot 서비스

itgroup 2023. 2. 22. 21:43
반응형

Spring Boot 서비스

Linux 시스템에서 실행 가능한 jar as a Service로 패키지된 Spring Boot 애플리케이션을 적절하게 구성하는 방법아니면 이 앱을 war로 변환하여 Tomcat에 설치해야 합니까?

Spring 어플리케이션을 할 수 .screen세션은 좋지만 서버를 재부팅한 후 수동으로 시작해야 합니다.

인 조언 또는 입니다.init.d스크립트(실행 가능 항아리에 대한 접근법이 적절한 경우)

다음은 springboot 1.3 이상에서 작동합니다.

init.d 서비스로

실행 가능한 jar에는 일반적인 start, stop, restart 및 status 명령이 있습니다.또, 통상의 /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에 다음 스크립트를 추가합니다.서비스:

[Unit]
Description=myapp
After=syslog.target

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

[Install]
WantedBy=multi-user.target

NB: 이 메서드를 사용하는 경우, jar 파일 자체를 (chmod +x를 사용하여) 실행 가능하게 하는 것을 잊지 마십시오.그렇지 않으면 "Permission denied" 오류와 함께 실패합니다.

언급

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

다음은 Linux에서 Java 애플리케이션을 시스템 서비스로 설치하는 가장 쉬운 방법입니다.

를 들어, 여러분이 해 보겠습니다.systemd(요즘의 어떤 디스트로도 그렇게 하고 있다)

서비스 ./etc/systemd/system★★★★★★★★★★★★★★★★★★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 파일 "Displayed" "Displayed" :

systemctl daemon-reload

기동시에 실행할 수 있도록 합니다.

systemctl enable javaservice.service

최종적으로 다음 명령을 사용하여 새 서비스를 시작/정지할 수 있습니다.

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

「 」를 사용하고 있는 systemd이는 Java 애플리케이션을 시스템서비스로 설정하는 가장 비침해적이고 깨끗한 방법입니다.

이 솔루션에서 특히 마음에 드는 점은 다른 소프트웨어를 설치 및 구성할 필요가 없다는 점입니다.된 ★★★★★★systemd는 모든 기능을 수행하며 서비스는 다른 시스템 서비스와 동일하게 동작합니다.지금은 여러 디스트로에서 잠시 사용하고 있습니다만, 예상대로 동작합니다.

하나의 은 '먹다'를 /usr/bin/java , , , , , , , , , , , , , , , , , , , , , , , , , , , .jvm음음 등의 변수-Xmx256m.

.systemdSpring Boot 공식 매뉴얼에 기재되어 있습니다.

매우 편리한 데몬인 슈퍼바이저를 사용하여 서비스를 쉽게 제어할 수도 있습니다.이러한 서비스는 어떤 사용자가 어떤 디렉토리에서 무엇을 실행할지 정의하는 단순한 구성 파일에 의해 정의되며, 수많은 옵션이 있습니다.supervisorord는 구문이 매우 단순하기 때문에 SysV init 스크립트를 작성하는 대신 매우 적합합니다.

실행 또는 제어하려는 프로그램의 간단한 슈퍼코드컨피규레이션파일을 나타냅니다.(이것을 /etc/syslogor/conf.d/yourapp.conf에 넣습니다.)

/etc/syslogor/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을 실행해야 합니다.이것에 의해, 애플리케이션의 기동, 정지, 스테이터스가 표시되는 프롬프트가 표시됩니다.

CLI

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

경우,supervisord은 이미 하지 않고 "Daemon" 을 할 수 .이 작업은 간단하게 수행할 수 있습니다.reread ★★★★★★★★★★★★★★★★★」updatesupervisorctlsnowledge를 선택합니다.

따라서 SysV Init 스크립트를 사용할 때 사용할 수 있는 모든 플렉시빌라이트를 쉽게 사용할 수 있습니다. 문서를 참조하십시오.

저는 이제 막 이 일을 할 수 있게 되었기 때문에, 아래는 1센트의 관점에서 지금까지의 저의 입장입니다.OS init.d 서비스 컨트롤러 스크립트.아직까지는 꽤 잘 작동하고 있습니다만, 저는 리트 배쉬 해커가 아니기 때문에 개선의 여지가 있다고 생각하기 때문에, 개선의 생각은 환영입니다.

스크립트가 ./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를에 서버 후 할 수 Cent에 .OS를 사용하고 있기 때문에 서버 재시작 후 서비스가 시작되도록 하기 위해 서비스 제어 스크립트를 설치했습니다./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

정지 시에는 스프링 부트 액추에이터를 사용하여 제어된 셧다운을 실행하려고 합니다.단, Actuator가 설정되어 있지 않거나 적절한 시간 내에 셧다운되지 않는 경우(실제로 조금 짧은 5초)에는 프로세스가 종료됩니다.

또한 이 스크립트는 어플리케이션을 실행하는 Java 프로세스만이 프로세스 상세 텍스트에 "my-spring-boot-api.jar"가 있는 것으로 가정합니다.이것은 내 환경에서 안전한 가정이며 PID를 추적할 필요가 없습니다.

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>

'로 정리해 .mvn clean packageln -s /.../myapp.jar /etc/init.d/myapp 가능한 으로 합니다.chmod +x /etc/init.d/myappservice myapp start 사용 (Ubuntu 서버 사용)

오래된 질문인 것은 알지만 Appassembler-maven-plugin이라는 또 다른 방법을 제시하고자 합니다.다음은 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>

윈도 서비스로서의

Windows 머신에서 실행되도록 하려면 에서 winsw.exe를 다운로드하십시오.

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

그런 다음 jar filename으로 이름을 변경합니다(: 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

see/run/stop 서비스의 경우: win+r을 입력하고 Administrative tools를 입력한 후 서비스를 선택합니다.그런 다음 run/stop 옵션을 오른쪽 클릭합니다.

다음은 실행 가능한 jar를 systemd 서비스로 배포하는 스크립트입니다.

서비스 및 .service 파일에 대한 사용자를 생성하고 /var 아래에 jar 파일을 배치하고 권한을 기본적으로 잠급니다.

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

예:

WAR/JAR 레이아웃 systemd 서비스를 하게 되었습니다.

java -jar라고 부르는 이유는 유연성이 높기 때문입니다.Exec Start=spring-mvc.war도 넣으려고 했는데 실행 가능하지만 'Exec format error'가 표시됨

어쨌든 현재 systemd는 모든 distros에 존재하며 로그를 리다이렉트하기 위한 훌륭한 솔루션을 제공합니다(서비스가 log4j 파일 위치를 시작하지도 않을 경우 syserr이 중요합니다:).

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

로그 회전시키다

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
}

로그로토레이트 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
}

Centos 6 / RHEL용 My 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

springboot 어플리케이션을 "init"로 표시하려고 합니다.d" 스타일의 셸 스크립트로 끝에 압축된 Java 어플리케이션이 부착되어 있습니다.

이러한 스크립트를 /etc/init.d/spring-app.jar에서 /opt/spring-app.jar로 심볼링크하여 jar를 실행 가능하게 함으로써 "/etc/init.d/spring-app start" 및 상태 작업 등의 가능성을 설정할 수 있습니다.

springboot' init.d' 등)이 것 # Default-Start: 2 3 4 5는 " chkconfig를 "service"로할 수 .

하지만 systemd와 함께 작동하기를 원했습니다.

이 작업을 수행하기 위해 위의 답변에서 많은 수신자를 시도했지만 Springboot 1.3이 설치된 Centos 7.2에서 작동하지 않았습니다.대부분 서비스를 시작하지만 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

이 질문에서는 @PbxMan의 답변을 통해 시작할 수 있습니다.

Linux에서 Java Application as a Service 실행

편집:

cron을 사용하여 reboot 시 프로세스를 시작하는 다른 방법이 있습니다.

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

이 방법은 작동하지만 애플리케이션에 적합한 Start/Stop 인터페이스를 제공하지 않습니다. 할 수 .kill★★★★★★★★★★★★。

스프링 부트 프로젝트의 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 어플리케이션의 run 인수를 설정하는 경우는, 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의 램이 설정되어 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의 권한이 구성되므로 jar는 쓸 수 없고 jar 소유자의 springboot에서만 읽거나 실행할 수 있습니다.

필요에 따라 change attribute(chattr) 명령을 사용하여 jar 파일을 불변으로 만들 수 있습니다.

sudo chattr +i your-app.jar

대응하는 .conf 파일에도 적절한 권한을 설정해야 합니다. .conf에는 읽기 + 실행(10월 500) 액세스 대신 읽기 액세스(10월 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에 의해 정지된 경우 자동으로 프로세스 재시작

다음 두 가지 속성(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

서비스 중지 시작

Ubuntu 16.04 LTS 및 18.04 LTS에서 systemctl을 사용하여 프로세스를 시작 및 중지할 수 있습니다.

프로세스를 개시하다

sudo systemctl start your-app

프로세스를 정지합니다.

sudo systemctl stop your-app

레퍼런스

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

Java 앱에서 그렇게 하기 위한 "표준" 축소 포장 방법은 모르겠지만, 확실히 좋은 생각입니다(운영 체제의 킵얼라이브 및 모니터링 기능이 있는 경우).Spring Boot 툴의 서포트(매븐과 그라들)를 제공하는 로드맵에 기재되어 있습니다만, 현시점에서는 독자적인 툴이 필요하게 될 가능성이 있습니다.현재 제가 알고 있는 최고의 솔루션은 Foreman입니다.Foreman은 선언적인 접근법과 다양한 표준 OS 형식(모니트, sys V, upstart 등)의 init 스크립트를 패키징하기 위한 한 줄의 명령어를 갖추고 있습니다.또한 사람들이 gradle로 물건을 세팅했다는 증거도 있습니다(: 여기).

메이븐을 사용하시나요?그런 다음 AppAssemblyler 플러그인을 사용해 보십시오.

Application Assembler Plugin은 Java 응용 프로그램을 시작하기 위한 스크립트를 생성하기 위한 Maven 플러그인입니다. ...생성된 bin 스크립트의 클래스 경로에 모든 아티팩트(종속성 + 프로젝트의 아티팩트)가 추가됩니다.

지원되는 플랫폼:

Unix 변수

Windows NT(Windows 9x는 지원되지 않습니다)

Java 서비스 래퍼(JSW)

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

Chad의 훌륭한 답변에 이어 "Error: Cannot find or load main class"라는 오류가 발생하여 Java 앱을 시작하는 셸 스크립트를 실행하든 systemd 자체에서 시작하는 셸 스크립트를 실행하든 몇 시간 동안 문제 슈팅을 시도하면 클래스 경로가 100% 정확하다는 것을 알 수 있습니다. 예를 들어 셸 스크립트를 수동으로 실행하는 등입니다.systemd execstart 실행과 마찬가지로 동작합니다.올바른 사용자로 작업을 실행하고 있는지 확인하십시오.제 경우, 트러블 슈팅에 꽤 시간이 걸리고 나서, 다른 유저를 시험해 보았습니다.- 드디어, 유저로서 root을 넣었습니다- voila, 앱은 올바르게 기동했습니다.잘못된 사용자 문제라고 판단한 후,chown -R user:user폴더와 하위 폴더 및 앱이 지정된 사용자 및 그룹으로 올바르게 실행되었기 때문에 더 이상 루트로 실행할 필요가 없습니다(보안 불량).

할 수도 있고 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스프링 부츠를 들어,라고 하는 것이 .server.portSERVER_PORT환경변수로서 다음과 같이 합니다.

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

여기서 이용되는 메커니즘은 Spring Boot 어플리케이션이 속성 목록을 가져와서 변환하고 모든 것을 대문자로 만들고 점을 밑줄로 바꿉니다.Spring Boot 앱은 이 과정을 거치면 일치하는 환경 변수를 찾아 그에 따라 발견된 변수를 사용합니다.

이는 다음 SO Q&A에서 자세히 설명되어 있습니다.환경변수를 통해 이름에 밑줄을 사용하여 Spring Boot 속성을 설정하려면 어떻게 해야 합니까?

레퍼런스

Ubuntu에서 Systemd 서비스를 사용할 수 있습니다.

[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

자세한 설명과 다양한 방법을 보려면 이 링크를 클릭하십시오.http://www.baeldung.com/spring-boot-app-as-a-service

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

레퍼런스

링크 설명을 여기에 입력하십시오.

Spring Boot 2.4.4의 경우 @ismael의 지시 외에

maven pom.xml에 실행 가능한 항아리를 만들기 위해 다음과 같은 것이 있습니다.

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>               
            <configuration>
                <executable>true</executable>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

언급URL : https://stackoverflow.com/questions/21503883/spring-boot-application-as-a-service

반응형