एक सेवा के रूप में स्प्रिंग बूट आवेदन


197

लिनक्स सिस्टम में एक सेवा के रूप में निष्पादन योग्य जार के रूप में पैक किए गए अच्छी तरह से स्प्रिंग बूट एप्लिकेशन को कैसे कॉन्फ़िगर करें? क्या यह अनुशंसित दृष्टिकोण है, या मुझे इस ऐप को युद्ध और टॉमकैट में स्थापित करना चाहिए?

वर्तमान में मैं screenसत्र से स्प्रिंग बूट एप्लिकेशन चला सकता हूं , जो अच्छा है, लेकिन सर्वर रिबूट के बाद मैन्युअल शुरुआत की आवश्यकता है।

यदि मैं सामान्य सलाह / निर्देश या नमूना init.dस्क्रिप्ट की तलाश कर रहा हूं , अगर निष्पादन योग्य जार के साथ मेरा दृष्टिकोण उचित है।


आरंभ करने के लिए, क्या आपका वितरण upstart या systemd का उपयोग करता है?
यगलोद

1
इसे बाहर की जाँच करें github.com/rburgst/spring-boot-initscript/blob/master/…
Dan Torrey

जवाबों:


138

स्प्रिंगबूट 1.3 और इसके बाद के संस्करण के लिए निम्नलिखित काम करता है:

Init.d सेवा के रूप में

निष्पादन योग्य जार की सामान्य शुरुआत, रोक, पुनः आरंभ और स्थिति कमांड हैं। यह सामान्य / var / run निर्देशिका में PID फ़ाइल भी सेट करेगा और डिफ़ॉल्ट रूप से सामान्य / var / log निर्देशिका में लॉगिंग करेगा।

आपको बस अपने जार को /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 में स्थापित स्प्रिंग बूट एप्लिकेशन को चलाने के लिए आप /etc/systemd/system/myapp.service में निम्न स्क्रिप्ट जोड़ सकते हैं:

[Unit]
Description=myapp
After=syslog.target

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

[Install]
WantedBy=multi-user.target

NB: यदि आप इस पद्धति का उपयोग कर रहे हैं, तो जार फ़ाइल को निष्पादन योग्य (chmod + x के साथ) बनाना न भूलें, अन्यथा यह "अनुमति अस्वीकृत" त्रुटि के साथ विफल हो जाएगा।

संदर्भ

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


1
"पूरी तरह से निष्पादन योग्य जार" दृष्टिकोण कैसे काम करता है? मैं CentOS 6.6 का उपयोग करता हूं। मैंने <executable>true</executable>अपने साथ जोड़ा pom.xml, लेकिन पैक की गई JAR फ़ाइल निष्पादित नहीं होती है (... ./myapp.jar ... cannot execute binary file)
अब्दुल

5
यह उत्तर केवल वर्तमान 1.3 मील के पत्थर के लिए काम करता है, जो अभी तक जारी नहीं किया गया है। 1.1 और 1.2 शाखाओं को यहां अन्य प्रतिक्रियाओं की जांच करने की आवश्यकता होगी।
वूर

6
क्या आप जानते हैं कि -Dspring.profiles.active=prodइस तरह की सेवाओं के लिए वसंत के तर्कों को कैसे पारित किया जाए? प्रश्न - stackoverflow.com/questions/31242291/…
nKognito

2
मैं स्प्रिंग-बूट एप्लिकेशन को रोक नहीं पा रहा हूं। /etc/init.d stopएप्लिकेशन को रोक नहीं रहा है, इसे फिर से शुरू करने की कोशिश कर रहा है।
टिनटिन

2
आप की निगरानी प्रक्रिया करना चाहते हैं और उसे पुन: प्रारंभ करता है, तो यह प्रणाली डेमॉन लेखन के बिना मर तो बाहर की जाँच patrickgrimard.com/2014/06/06/...
RUX

112

लिनक्स में सिस्टम सेवा के रूप में जावा एप्लिकेशन इंस्टॉल करने का सबसे आसान तरीका क्या है।

मान लें कि आप उपयोग कर रहे हैं 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नई सेवा फ़ाइल की सूचना:

systemctl daemon-reload

और इसे सक्षम करें, इसलिए यह बूट पर चलता है:

systemctl enable javaservice.service

आखिरकार, आप अपनी नई सेवा को शुरू / बंद करने के लिए निम्न आदेशों का उपयोग कर सकते हैं:

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

बशर्ते आप उपयोग कर रहे हैं systemd, यह जावा-एप्लिकेशन को सिस्टम-सर्विस के रूप में सेट करने के लिए सबसे गैर-घुसपैठ और साफ तरीका है।

मुझे इस समाधान के बारे में विशेष रूप से पसंद है तथ्य यह है कि आपको किसी अन्य सॉफ़्टवेयर को स्थापित और कॉन्फ़िगर करने की आवश्यकता नहीं है। भेज दिया systemdगया आपके लिए सभी काम करता है, और आपकी सेवा किसी अन्य सिस्टम सेवा की तरह व्यवहार करती है। मैं इसे कुछ समय के लिए अलग-अलग डिस्ट्रो पर उत्पादन में उपयोग करता हूं, और यह सिर्फ उसी तरह काम करता है जैसा आप उम्मीद करते हैं।

एक और प्लस यह है कि, का उपयोग करके /usr/bin/java, आप आसानी से jvmजैसे paramters जोड़ सकते हैं -Xmx256m

systemdआधिकारिक स्प्रिंग बूट प्रलेखन में भाग भी पढ़ें : http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html


दुर्भाग्य से systemd Centos 6
MariuszS

इसे कैसे रोका जाए? पिड रिकॉर्ड करता है और फिर उसे मारता है?
धुंध

2
स्प्रिंग बूट 1.3+ के साथ आप पूरी तरह से निष्पादन योग्य युद्ध फ़ाइल उत्पन्न कर सकते हैं, इसलिए जावा -जर ... बिट की आवश्यकता नहीं है, बस फ़ाइल के नाम का उपयोग करें।
पियरे हेनरी

1
मैं पूर्ण जावा कमांडलाइन का उपयोग करना पसंद करता हूं क्योंकि इस तरह आप jvm पैरामीटर जोड़ सकते हैं।
20

1
एक उचित बूट अनुक्रम के लिए आप करने के लिए आदेश देने के बयान को जोड़ने के लिए चाहते हो सकता है [Unit]अनुभाग, जैसे After=mysql.service, Before=apache2.service
rustyx

57

आप पर्यवेक्षक का भी उपयोग कर सकते हैं जो एक बहुत ही आसान डेमॉन है, जिसका उपयोग आसानी से सेवाओं को नियंत्रित करने के लिए किया जा सकता है। इन सेवाओं को सरल कॉन्फ़िगरेशन फ़ाइलों द्वारा परिभाषित किया जाता है जो परिभाषित करता है कि किस उपयोगकर्ता के साथ किस निर्देशिका में और इसके आगे, एक zillion विकल्प हैं। पर्यवेक्षक के पास एक बहुत ही सरल वाक्यविन्यास है, इसलिए यह 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

एप्लिकेशन को नियंत्रित करने के लिए आपको पर्यवेक्षक को निष्पादित करने की आवश्यकता होगी, जो आपको एक संकेत देगा जहां आप शुरू कर सकते हैं, रोक सकते हैं, स्टेटस youpp कर सकते हैं।

CLI

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

यदि supervisordडेमॉन पहले से ही चल रहा है और आपने अपने सीरियस के लिए कॉन्फ़िगरेशन को जोड़े बिना डेमॉन को पुनरारंभ किए बिना आप केवल शेल में कमांड rereadऔर updateकमांड कर सकते हैं supervisorctl

यह वास्तव में आपको SysV Init स्क्रिप्ट का उपयोग करने वाले सभी flexibilites देता है, लेकिन इसका उपयोग करना और नियंत्रण करना आसान है। प्रलेखन पर एक नज़र डालें ।


अंत में मेरे लिए कुछ सही काम किया। पर्यवेक्षक संकेत के लिए बहुत बहुत धन्यवाद।
विटाली सज़ानोविच 12

यह वही काम करता है systemd, जो सबसे वर्तमान लिनक्स डिस्ट्रोस में बनाया गया है।
रस्टीक्स

18

मैं बस अपने आप को ऐसा करने के लिए चारों ओर हो गया है, इसलिए निम्नलिखित वह जगह है जहां मैं अब तक एक CentOS 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 का उपयोग कर रहा हूं, इसलिए यह सुनिश्चित करने के लिए कि सर्वर के पुनरारंभ होने के बाद मेरी सेवाएं शुरू हो जाएं, मेरे पास एक सेवा नियंत्रण स्क्रिप्ट है /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

जैसा कि आप देख सकते हैं, कि पर्यावरण चर को स्थापित करने के लिए प्रारंभिक कॉन्फिग स्क्रिप्ट को कॉल करता है और फिर एक साझा स्क्रिप्ट को कॉल करता है जिसका उपयोग मैं अपनी सभी स्प्रिंग बूट सेवाओं को पुनः आरंभ करने के लिए करता हूं। वह साझा स्क्रिप्ट वह जगह है जहां से यह सब पाया जा सकता है:

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

रोकते समय, यह एक नियंत्रित शटडाउन करने के लिए स्प्रिंग बूट एक्टुएटर का उपयोग करने का प्रयास करेगा। हालाँकि, यदि एक्ट्यूएटर कॉन्फ़िगर नहीं है या एक उचित समय सीमा के भीतर बंद होने में विफल रहता है (मैं इसे 5 सेकंड देता हूं, जो वास्तव में थोड़ा कम है), तो प्रक्रिया को मार दिया जाएगा।

इसके अलावा, स्क्रिप्ट यह अनुमान लगाती है कि तालमेल से चलने वाली जावा प्रक्रिया प्रक्रिया विवरण के पाठ में "माई-स्प्रिंग-बूट-एपीआई.जर" के साथ एक ही होगी। यह मेरे वातावरण में एक सुरक्षित धारणा है और इसका मतलब है कि मुझे पीआईडी ​​पर नज़र रखने की आवश्यकता नहीं है।


3
अपनी खुद की स्टार्ट / स्टॉप स्क्रिप्ट लिखने की आवश्यकता नहीं है। यह स्प्रिंग बूट 1.3 और ऊपर के रूप में प्रदान किया गया है। अधिक विवरण के लिए docs.spring.io/spring-boot/docs/current/reference/htmlsingle/… देखें ।
ग्रेगटर्न

यह जानना अच्छा है कि यह एक विकल्प है, लेकिन इसका उपयोग करने के लिए निष्पादित करने की आवश्यकता को हटा दिया जाता है java -jar। बाकी स्क्रिप्ट की अभी भी जरूरत है।
स्टीव

जब /etc/init.d या systemd विकल्प नहीं है, तो साझा करने के लिए धन्यवाद बहुत उपयोगी है।
bernardn

@ सच: नोप। आप पहिया को फिर से मजबूत कर रहे हैं। ओह, और हमारे पास अब सिस्टमड है।
मार्टिन श्रोडर

जब आपको JVM (जैसे -javaagent या -D पैरामीटर) को पैरामीटर पास करने की आवश्यकता होती है, तो यह अनोखा तरीका है, @Steve tks!
Dyorgio

14

यदि आप स्प्रिंग बूट मावेन प्लगइन 1.3.0.M2 के साथ स्प्रिंग बूट 1.2.5 का उपयोग करना चाहते हैं, तो यहां इसका समाधान है:

<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 packageएक सिम्कलिन बनाएं , ln -s /.../myapp.jar /etc/init.d/myappइसे निष्पादन योग्य बनाएं chmod +x /etc/init.d/myappऔर इसे शुरू करें service myapp start(उबंटू सर्वर के साथ)


रन करने योग्य WAR फ़ाइलों के बारे में क्या? यह मेरे लिए WAR लेआउट के साथ काम नहीं करता है।
रादु टोडर

दिलचस्प रूप से यह रिलीज के साथ काम करता है 1.3.0.M2, लेकिन जब मैंने कोशिश की तो मुझे एक त्रुटि मिली 1.3.0.RC1
जेबीसीपी

कैसे maven के बजाय gradle के साथ ऐसा करने के बारे में कोई विचार?
गीयर

ग्रैडल का उपयोग करते समय, यह कॉन्फ़िगरेशन springBoot { executable = true }ब्लॉक का उपयोग करके किया जाता है ।
नैटिक्स

@RaduToader: क्या आप WAR फ़ाइल को सेवा के रूप में निष्पादित करने में सक्षम थे?
नवीनकुमारब

9

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं अभी तक एक और तरीका पेश करना चाहता था जो कि ऐपस्सेम्बलर-मावेन-प्लगइन है । यहाँ मेरा 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

एक विन्डोज़ सेवा के रूप में

यदि आप चाहते हैं कि यह विंडोज़ मशीन में चले तो winw.exe डाउनलोड करें

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

इसके बाद इसे जार फ़ाइल नाम में बदलें (जैसे: your-app .jar)

winsw.exe -> your-app.exe

अब एक xml फ़ाइल अपने 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

इसके बाद एडमिनिस्ट्रेटर में ओपन कमांड प्रॉम्प्ट प्रबल हो जाता है और इसे विंडोज़ सेवा में स्थापित किया जाता है।

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

बस :) ।

खिड़कियों में सेवा की स्थापना रद्द करने के लिए

your-app.exe uninstall

सेवा को देखने / चलाने / रोकने के लिए: विन + आर और प्रशासनिक उपकरण टाइप करें और फिर उस सेवा का चयन करें । फिर राइट क्लिक का विकल्प चुनें - रन / स्टॉप


मैंने कंपनी के इंट्रानेट एनवी में विंडोज़ सेवा के रूप में स्प्रिंग बूट जार को चलाने के लिए समान चरणों का पालन किया है, लेकिन सेवा नहीं उठ रही है। त्रुटि के साथ एक विंडो आ रही है: त्रुटि: 1067 अप्रत्याशित रूप से समाप्त की गई प्रक्रिया क्या आप मदद कर सकती है या सुझाव दे सकती है कि क्या करने की आवश्यकता है?
निखिल सिंह भदौरिया

क्या आपके पास ऐसा करने की सभी अनुमति है? यदि आप एक व्यवस्थापक हैं तो यह किसी भी समस्या का कारण नहीं होगा। क्या आप कृपया जाँच सकते हैं कि आपके पास व्यवस्थापक अधिकार हैं।
अरुणदेव

stackoverflow.com/questions/18205111/… क्या आप यह कोशिश कर सकते हैं यह हो सकता है कि इससे यू को समस्या हल करने में मदद मिले।
अरुणदेव

त्वरित प्रतिक्रिया के लिए धन्यवाद, मुझे अपनी सेवा मिल गई और xml फ़ाइल में टैग के साथ एक समस्या को ठीक करके चल रहा है।
निखिल सिंह भदौरिया

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

यहां एक स्क्रिप्ट है जो एक निष्पादन योग्य जार को सिस्टमड सर्विस के रूप में दर्शाती है।

यह सेवा और .service फ़ाइल के लिए एक उपयोगकर्ता बनाता है, और जार फ़ाइल को / 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

मैं स्प्रिंगबूट एप्लिकेशन बनाने की कोशिश कर रहा हूं जो अंत में एक संकुचित जावा एप्लिकेशन डील के साथ "init.d" स्टाइल शेल स्क्रिप्ट के रूप में प्रस्तुत किए जाते हैं।

इन लिपियों को /etc/init.d/spring-app से /opt /spring-app.jar और chmod'ing से जार को निष्पादित करने से जार को निष्पादन योग्य बनाया जा सकता है "/etc/init.d/spring-app start "" /etc/init.d/spring-app stop "और अन्य संभावनाएं जैसे स्थिति काम

संभवतः, init.d स्प्रिंगबूट से शैली लिपियों के रूप में वे neccessary मैजिक स्ट्रिंग्स (जैसे # Default-Start: 2 3 4 5) chkconfig को "सेवा" के रूप में जोड़ पाएंगे

लेकिन मैं इसे सिस्टमड के साथ काम करना चाहता था

इस काम को करने के लिए मैंने ऊपर के अन्य उत्तरों में प्राप्तकर्ताओं में से कई की कोशिश की, लेकिन उनमें से किसी ने मेरे लिए सेंटोस 7.2 पर काम नहीं किया, जिसमें स्प्रिंगबूट 1.3 के साथ ज्यादातर वे सेवा शुरू कर देंगे, लेकिन पीआईडी ​​को ट्रैक करने में सक्षम नहीं होंगे।

अंत में मैंने पाया कि मेरे लिए निम्न कार्य किया गया था, जब /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 सेवा करना समाप्त कर दिया

मैं जावा -जर कह रहा हूं क्योंकि यह अधिक लचीला है। ExecStart = spring-mvc.war डालने की भी कोशिश की, लेकिन निष्पादन योग्य होने के बावजूद, मुझे 'Execraft त्रुटि' मिली

इन दिनों वैसे भी, सिस्टमड सभी डिस्ट्रो पर मौजूद है, और लॉग्स को पुनर्निर्देशित करने के लिए एक अच्छा समाधान प्रदान करता है (जब आप सेवा शुरू भी नहीं करते हैं तो 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 जी.सी.

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 का उत्तर आपको मिलना चाहिए:

लिनक्स पर एक सेवा के रूप में जावा एप्लिकेशन चलाएं

संपादित करें:

क्रोन का उपयोग करके रिबूट पर एक प्रक्रिया शुरू करने का एक और अच्छा तरीका है।

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

यह काम करता है, लेकिन आपको अपने आवेदन के लिए कोई अच्छा स्टार्ट / स्टॉप इंटरफ़ेस नहीं देता है। आप अभी भी killइसे वैसे भी कर सकते हैं ...


वास्तव में नहीं, क्योंकि स्प्रिंग बूट ऐसा करने के लिए विशेष सुविधाएँ प्रदान करता है।
त्रिस्टान

2

मुझे एक "मानक" सिकुड़ते-लपेटते रास्ते का पता नहीं है जो कि जावा ऐप के साथ होता है, लेकिन यह निश्चित रूप से एक अच्छा विचार है (यदि आप वहां हैं तो ऑपरेटिंग सिस्टम के रख-रखाव और निगरानी क्षमताओं से लाभ उठाना चाहते हैं) । यह स्प्रिंग बूट टूल सपोर्ट (मावेन और ग्रेडेल) से कुछ प्रदान करने के लिए रोडमैप पर है, लेकिन अब के लिए आप शायद अपना रोल करने जा रहे हैं। सबसे अच्छा समाधान जो मुझे अभी पता है , वह फोरमैन है , जिसमें एक घोषणात्मक दृष्टिकोण है और विभिन्न मानक ओएस प्रारूपों (मोनिट, एसईएस वी, अपस्टार्ट आदि) के लिए इनिट लिपियों की पैकेजिंग के लिए एक लाइन कमांड है। लोगों के पास सामान रखने के भी सबूत हैं (जैसे यहां )।


2

क्या आप मावेन का उपयोग कर रहे हैं? फिर आपको AppAssembler Plugin आज़माना चाहिए:

अनुप्रयोग असेंबलर प्लगइन जावा अनुप्रयोगों को शुरू करने के लिए स्क्रिप्ट उत्पन्न करने के लिए एक मावेन प्लगइन है। ... सभी कलाकृतियों (निर्भरता + परियोजना से विरूपण साक्ष्य) उत्पन्न बिन लिपियों में क्लासपाथ में जोड़े जाते हैं।

समर्थित प्लेटफ़ॉर्म:

यूनिक्स वेरिएंट

Windows NT (Windows 9x समर्थित नहीं है)

जावा सेवा आवरण (JSW)

देखें: http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/index.html


2

स्प्रिंग बूट प्रोजेक्ट्स में build.gradle फ़ाइल में निम्न कॉन्फ़िगरेशन आवश्यक है।

build.gradle

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

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

निष्पादन योग्य = सत्य

यह यूनिक्स प्रणाली (Centos और Ubuntu) पर पूरी तरह से निष्पादन योग्य जार बनाने के लिए आवश्यक है

एक .conf फ़ाइल बनाएँ

यदि आप कस्टम JVM प्रॉपर्टीज़ या स्प्रिंग बूट एप्लिकेशन रन तर्क को कॉन्फ़िगर करना चाहते हैं, तो आप स्प्रिंग बूट एप्लिकेशन नाम के समान .conf फ़ाइल बना सकते हैं और इसे जार फ़ाइल के समानांतर रख सकते हैं।

यह देखते हुए कि आपका app.jar आपके स्प्रिंग बूट एप्लिकेशन का नाम है, तो आप निम्न फ़ाइल बना सकते हैं।

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

यह कॉन्फ़िगरेशन स्प्रिंग बूट एप्लिकेशन के लिए 64 एमबी रैम सेट करेगा और ठेस प्रोफाइल को सक्रिय करेगा।

लिनक्स में एक नया उपयोगकर्ता बनाएँ

बढ़ी हुई सुरक्षा के लिए हमें स्प्रिंग बूट एप्लिकेशन को सेवा के रूप में चलाने के लिए एक विशिष्ट उपयोगकर्ता बनाना होगा।

एक नया उपयोगकर्ता बनाएँ

sudo useradd -s /sbin/nologin springboot

उबंटू / डेबियन पर, उपरोक्त कमांड को निम्नानुसार संशोधित करें:

sudo useradd -s /usr/sbin/nologin springboot

पासवर्ड सेट करें

sudo passwd springboot

निष्पादन योग्य फ़ाइल का स्प्रिंगबूट स्वामी बनाएं

chown springboot:springboot your-app.jar

जार फ़ाइल के संशोधन को रोकें

chmod 500 your-app.jar

यह जार की अनुमतियों को कॉन्फ़िगर करेगा ताकि इसे लिखा न जा सके और इसे केवल इसके मालिक स्प्रिंगबूट द्वारा पढ़ा या निष्पादित किया जा सके।

आप वैकल्पिक रूप से अपनी जार फ़ाइल को परिवर्तन विशेषता (chattr) कमांड का उपयोग करके अपरिवर्तनीय बना सकते हैं।

sudo chattr +i your-app.jar

उपयुक्त .conf फ़ाइल के लिए भी उपयुक्त अनुमतियाँ सेट की जानी चाहिए। .conf को read + execute (Octal 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

ओएस द्वारा मार दिए जाने पर स्वचालित रूप से प्रक्रिया को फिर से शुरू करें

विफलता पर प्रक्रिया को स्वचालित रूप से पुनरारंभ करने के लिए नीचे दिए गए दो विशेषताओं (पुनरारंभ करें और पुनरारंभ करें) को जोड़ें।

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

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

परिवर्तन 30 सेकंड की देरी के साथ विफलता के मामले में स्प्रिंग बूट एप्लिकेशन को फिर से शुरू करेगा। यदि आप systemctl कमांड का उपयोग करके सेवा को रोकते हैं तो पुनरारंभ नहीं होगा।

सिस्टम स्टार्टअप पर अनुसूची सेवा

सिस्टम बूट पर स्वचालित रूप से शुरू करने के लिए एप्लिकेशन को ध्वजांकित करने के लिए, निम्न कमांड का उपयोग करें:

सिस्टम स्टार्टअप पर स्प्रिंग बूट एप्लिकेशन सक्षम करें

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

चाड के उत्कृष्ट उत्तर के बाद, यदि आपको "त्रुटि: मुख्य श्रेणी नहीं मिली या लोड नहीं हो सकी" - और आपको इसे हल करने के लिए कुछ घंटे बिताने होंगे, चाहे आपका शेल स्क्रिप्ट निष्पादित करना हो जो आपके जावा ऐप को शुरू करता है या इसे शुरू करना है। systemd से ही - और आप जानते हैं कि आपका classpath 100% सही है, उदाहरण के लिए शेल स्क्रिप्ट को मैन्युअल रूप से चलाने के साथ-साथ आपके पास जो systemd निष्पादित होता है वह चल रहा है। सुनिश्चित करें कि आप चीजों को सही उपयोगकर्ता के रूप में चला रहे हैं! मेरे मामले में, मैंने अलग-अलग उपयोगकर्ताओं की कोशिश की थी, काफी समय तक समस्या निवारण के बाद - मैं अंत में एक कूबड़ था, उपयोगकर्ता - वॉइला के रूप में रूट डाल दिया, ऐप सही ढंग से शुरू हुआ। यह निर्धारित करने के बाद कि यह एक गलत उपयोगकर्ता समस्या है, मैंchown -R user:user फ़ोल्डर और सबफ़ोल्डर और एप्लिकेशन को निर्दिष्ट उपयोगकर्ता और समूह के रूप में सही ढंग से चलाया गया है, इसलिए इसे रूट (खराब सुरक्षा) के रूप में चलाने की आवश्यकता नहीं है।


1

सिस्टमड यूनिट फाइलों में आप पर्यावरण चर निर्देशिका या के माध्यम से सेट कर सकते हैं 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.portपालन ​​किया जाएगा SERVER_PORT:

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

यहां शोषण किए जा रहे तंत्र का मतलब है कि स्प्रिंग बूट एप्लिकेशन गुणों की सूची ले लेंगे और फिर उनका अनुवाद करेंगे, सब कुछ बड़ा करेंगे और डॉट्स को अंडरस्कोर से बदल देंगे। एक बार जब स्प्रिंग बूट ऐप इस प्रक्रिया से गुजरता है, तो यह उस मैच के पर्यावरण चर की तलाश करता है, और तदनुसार पाए गए किसी भी उपयोग करता है।

इस SO Q & A शीर्षक में इस पर और अधिक विस्तार से प्रकाश डाला गया है: पर्यावरण चर के माध्यम से अपने नाम में अंडरस्कोर के साथ स्प्रिंग बूट संपत्ति कैसे सेट करें?

संदर्भ


1

इसे उबंटू में सिस्टमड सेवा का उपयोग करके किया जा सकता है

[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


1

अपने- app.service (बाकी 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.