লিনাক্সের পরিষেবা হিসাবে একটি জাভা অ্যাপ্লিকেশন চালান


128

আমি একটি জাভা সার্ভার অ্যাপ্লিকেশন লিখেছি যা একটি স্ট্যান্ডার্ড ভার্চুয়াল হোস্টেড লিনাক্স সমাধানে চলে। অ্যাপ্লিকেশনটি সকেট সংযোগগুলি শুনতে এবং তাদের জন্য নতুন হ্যান্ডলারগুলি তৈরি করতে সর্বদা চলমান runs এটি একটি ক্লায়েন্ট-সার্ভার অ্যাপ্লিকেশনটিতে একটি সার্ভার সাইড বাস্তবায়ন।

আমি যেভাবে এটি শুরু করব তা হ'ল এটি সার্ভারের স্টার্ট আপ rc.local স্ক্রিপ্টে অন্তর্ভুক্ত করে। তবে একবার শুরু হয়ে গেলে কীভাবে এটি বন্ধ করতে আমি এটি অ্যাক্সেস করতে জানি না এবং যদি আমি কোনও আপডেট ইনস্টল করতে চাই, তবে অ্যাপ্লিকেশনটি পুনরায় চালু করতে আমাকে সার্ভার পুনরায় চালু করতে হবে।

উইন্ডোজ পিসিতে, এই ধরণের অ্যাপ্লিকেশনটির জন্য আমি একটি উইন্ডোজ পরিষেবা তৈরি করতে পারি এবং তারপরে আমি থামাতে এবং নিজের ইচ্ছামত শুরু করতে পারি। লিনাক্স বাক্সে এমন কি কি আছে যাতে আমি যদি এই অ্যাপ্লিকেশনটি শুরু করি তবে আমি এটি বন্ধ করতে এবং সার্ভারের সম্পূর্ণ পুনরায় আরম্ভ না করে পুনরায় চালু করতে পারি।

আমার অ্যাপ্লিকেশনটির নাম WebServer.exe। এটি আমার rc.local এ যেমন অন্তর্ভুক্ত করে সার্ভার স্টার্টআপে শুরু করা হয়েছে :

java -jar /var/www/vhosts/myweb.com/phpserv/WebServer.jar &

আমি লিনাক্সে কিছুটা নুব তাই যে কোনও পোস্টের সাথে যে কোনও উদাহরণ প্রশংসিত হবে। তবে আমার কাছে এসএসএইচ এবং কোনও আপডেট ইনস্টল করার পাশাপাশি একটি প্লেস্ক প্যানেলে অ্যাক্সেসের বাক্সে সম্পূর্ণ এফটিপি অ্যাক্সেস রয়েছে।

উত্তর:


239

আমি এখানে অন্য একটি সহজ মোড়ক লিখেছি:

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

আপনি init.d জন্য একটি পূর্ণ টিউটোরিয়াল অনুসরণ করতে পারেন এখানে এবং systemd হল জন্য (উবুন্টু 16+) এখানে

আপনার যদি আউটপুট লগের প্রয়োজন হয় তবে প্রতিস্থাপন করুন 2

nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &

জন্য লাইন

nohup java -jar $PATH_TO_JAR >> myService.out 2>&1&

@ পিবিএক্সমান এটির জন্য ধন্যবাদ। আমি এটিকে একবার যেতে পারি এবং দেখতে পারি যে আমরা কীভাবে এগিয়ে যাচ্ছি। চিয়ার্স।
dreza

2
তবে আমি কীভাবে এই ফাইলটি চালাতে পারি? আমি এটা কোথায় রাখা উচিত?
জ্যাক ড্যানিয়েল

3
ডেবিয়ান ভিত্তিক ডিস্ট্রোজে জ্যাকডানিয়েল, যেমন ডেবিয়ান নিজে এবং উবুন্টু, আপনি সেই স্ক্রিপ্টটি /etc/init.d এ যুক্ত করতে পারেন। তারপরে আপনি এটিকে এই জাতীয়ভাবে আবেদন করতে পারেন: /etc/init.d/MyService শুরু করুন। এবং আপনি আপডেট-আরসি.ডি মাই সার্ভিস ডিফল্টগুলি চালিয়ে এটি স্বয়ংক্রিয়ভাবে শুরু করতে পারেন।
আন্দ্রে

1
@ ThorbjørnRavnAndersen এটি আপনার জাভা প্রোগ্রামের উপর নির্ভর করবে। আপনি যদি নিজের জাভা প্রোগ্রামটি হত্যা করতে না পারেন তবে stackoverflow.com/questions/2541597/… দেখুন । আমি হত্যার পরিবর্তে মাই সার্ভিস-পিড মুছে ফেলব এবং জাভা অংশে ডিমন থ্রেড রাখব যা এটি উপস্থিত কিনা তা পরীক্ষা করে।
পিবিএক্সমান

1
জারের আউটপুট ফাইলটি কোথায় হবে? আমি কিভাবে এই নামটি কনফিগার করতে পারি?
এম। শেহেনা

48

একটি সহজ সমাধান হ'ল স্ক্রিপ্ট স্টার্ট.শ তৈরি করা যা জাভা নোহুপের মাধ্যমে চালায় এবং তারপরে পিআইডি কোনও ফাইলে সংরক্ষণ করে:

nohup java -jar myapplication.jar > log.txt 2> errors.txt < /dev/null &
PID=$!
echo $PID > pid.txt

তারপরে আপনার স্টপ স্ক্রিপ্ট স্টপ.শ ফাইলটি থেকে পিআইডি পড়বে এবং অ্যাপ্লিকেশনটি মেরে ফেলবে:

PID=$(cat pid.txt)
kill $PID

অবশ্যই আমি কিছু বিবরণ রেখে গেছি, যেমন প্রক্রিয়াটি রয়েছে কিনা তা যাচাই করা এবং pid.txtআপনার কাজ শেষ হয়ে গেলে মুছে ফেলা ।


2
প্রশ্ন: কিল-পিআইডি কমান্ড প্রক্রিয়াটি শেষ না করেই হত্যার কারণ হবে না? আমি একটি সার্ভার প্রোগ্রাম লিখছি যা একটি ডাটাবেসের সাথে ইন্টারফেস করে এবং আমি চাই যে সমস্ত চলমান থ্রেডগুলি প্রোগ্রামটি শেষ হওয়ার আগেই শেষ করা উচিত, যাতে ডিবি বা কোনও কিছু লেখার মাঝখানে প্রোগ্রামটি মারা না যায় তা নিশ্চিত করে ।
স্কুবা স্টিভ

2
@ স্কুবা-স্টিভ সাজানো। কিল টিআরএম সিগন্যাল প্রেরণ করবে, যা স্থানে থাকা যে কোনও শাটডাউন হুককে অনুরোধ করবে, তাই আপনার প্রক্রিয়াটি নিখুঁতভাবে শেষ করতে তাদের ব্যবহার করুন। প্রক্রিয়াটি হত্যার সিগন্যাল পেলে তারা কার্যকর করবে না (যেমন, কিল -9)। ওএস আপনার শাটডাউন হুকগুলি ব্যাহত করতে পারে যদি তারা সম্পূর্ণরূপে বেশি সময় নিচ্ছে তবে তাদের
সংযুক্ত রাখুন

34

লিনাক্স পরিষেবা init স্ক্রিপ্ট এতে সংরক্ষণ করা হয় /etc/init.d। আপনি /etc/init.d/skeletonফাইলটি অনুলিপি এবং কাস্টমাইজ করতে পারেন এবং তারপরে কল করতে পারেন

service [yourservice] start|stop|restart

দেখতে http://www.ralfebert.de/blog/java/debian_daemon/ । এটি ডেবিয়ানের জন্য (সুতরাং উবুন্টুও) তবে আরও বিতরণের জন্য উপযুক্ত।


প্রতিশ্রুতিবদ্ধ মনে হচ্ছে। আমি এটিকে ঘনিষ্ঠভাবে দেখব। চিয়ার্স
dreza

11

হতে পারে সেরা ডেভ-অপস সমাধান নয়, তবে ল্যান পার্টি বা অনুরূপ কোনও সার্ভারের সাধারণ ব্যবহারের জন্য ভাল।

screenআপনার সার্ভারটি চালানোর জন্য ব্যবহার করুন এবং তারপরে লগ আউট করার আগে আলাদা করুন, এটি প্রক্রিয়াটি চালিয়ে রাখবে, আপনি যে কোনও সময়ে পুনরায় সংযুক্ত করতে পারেন।

কর্মধারা:

একটি পর্দা শুরু করুন: screen

আপনার সার্ভারটি শুরু করুন: java -jar minecraft-server.jar

টিপে বিচ্ছিন্ন: Ctl-a,d

পুনরায় সংযুক্ত করুন: screen -r

এখানে আরও তথ্য: https://www.gnu.org/software/screen/manual/screen.html



5

একটি পরিষেবা হিসাবে স্প্রিং বুট অ্যাপ্লিকেশনটিকেও উল্লেখ করে আমি systemdসংস্করণে যাব , কারণ এটি সবচেয়ে সহজ, কমপক্ষে ভারবজ এবং সর্বোত্তম আধুনিক ডিস্ট্রোজে সংযুক্ত (এবং সেন্টোস x.x এর মতো আধুনিকও নয়)।


4

সবচেয়ে সহজ উপায় হ'ল ব্যবহার করা supervisord। দয়া করে এখানে সম্পূর্ণ বিবরণ দেখুন: http://supervisord.org/

অধিক তথ্য:

/ubuntu/779830/running-an-executable-jar-file-when-the-system-starts/852485#852485

https://www.digitalocean.com/community/tutorials/how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps


4

এখানে একটি নমুনা শেল স্ক্রিপ্ট (নিশ্চিত করুন যে আপনি নিজের অ্যাপ্লিকেশনটির নামের সাথে ম্যাথের নামটি প্রতিস্থাপন করেছেন):

#!/bin/bash

### BEGIN INIT INFO
# Provides:                 MATH
# Required-Start:           $java
# Required-Stop:            $java
# Short-Description:        Start and stop MATH service.
# Description:              -
# Date-Creation:            -
# Date-Last-Modification:   -
# Author:                   -
### END INIT INFO

# Variables
PGREP=/usr/bin/pgrep
JAVA=/usr/bin/java
ZERO=0

# Start the MATH
start() {
    echo "Starting MATH..."
    #Verify if the service is running
    $PGREP -f MATH > /dev/null
    VERIFIER=$?
    if [ $ZERO = $VERIFIER ]
    then
        echo "The service is already running"
    else
        #Run the jar file MATH service
        $JAVA -jar /opt/MATH/MATH.jar > /dev/null 2>&1 &
        #sleep time before the service verification
        sleep 10
        #Verify if the service is running
        $PGREP -f MATH  > /dev/null
        VERIFIER=$?
        if [ $ZERO = $VERIFIER ]
        then
            echo "Service was successfully started"
        else
            echo "Failed to start service"
        fi
    fi
    echo
}

# Stop the MATH
stop() {
    echo "Stopping MATH..."
    #Verify if the service is running
    $PGREP -f MATH > /dev/null
    VERIFIER=$?
    if [ $ZERO = $VERIFIER ]
    then
        #Kill the pid of java with the service name
        kill -9 $($PGREP -f MATH)
        #Sleep time before the service verification
        sleep 10
        #Verify if the service is running
        $PGREP -f MATH  > /dev/null
        VERIFIER=$?
        if [ $ZERO = $VERIFIER ]
        then
            echo "Failed to stop service"
        else
            echo "Service was successfully stopped"
        fi
    else
        echo "The service is already stopped"
    fi
    echo
}

# Verify the status of MATH
status() {
    echo "Checking status of MATH..."
    #Verify if the service is running
    $PGREP -f MATH > /dev/null
    VERIFIER=$?
    if [ $ZERO = $VERIFIER ]
    then
        echo "Service is running"
    else
        echo "Service is stopped"
    fi
    echo
}

# Main logic
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status
        ;;
    restart|reload)
        stop
        start
        ;;
  *)
    echo $"Usage: $0 {start|stop|status|restart|reload}"
    exit 1
esac
exit 0

কিছু কারণে এটি সর্বদা রিপোর্ট করে পরিষেবা ইতিমধ্যে শুরু হয়েছে। মনে হচ্ছে যখন স্ক্রিপ্ট ভিতরে থেকে চালানো যে pgrep 0 ফেরার করা হয়, কিন্তু যদি আমি pgrep কমান্ড নিজে লিখুন এটা 1. ফেরৎ
HomeIsWhereThePcIs

পিগ্রিপ কেন এই পরিষেবাটি চলমান বলে মনে করে কারণ এটি "/ বিন / শ / এসবিন / পরিষেবা এমএটিএইচ শুরু" এবং "/ বিন / বাশ /etc/init.d/MATH শুরু" সনাক্ত করে এবং 0
HomeIsWhereThePcIs

3

একটি পরিষেবা হিসাবে স্প্রিং বুট অ্যাপ্লিকেশন থেকে , আমি পাইথন-ভিত্তিক supervisordঅ্যাপ্লিকেশনটির সুপারিশ করতে পারি । আরও তথ্যের জন্য স্ট্যাক ওভারফ্লো প্রশ্ন দেখুন। এটি সেট আপ করা সত্যই সোজা।


supervisordদুর্দান্ত, যারা জানেন না তাদের জন্য, এটি মনিটরিং পরিষেবাদির অনুমতি দেয় (যা হওয়া আবশ্যক foreground- তা নয় daemonized), এটি তারপরে পরিষেবাগুলি স্বয়ংক্রিয়ভাবে পুনঃসূচনা করবে (এবং প্লাগইনগুলির মাধ্যমে পুনরায় চালু হওয়ার সময় সতর্কতাগুলি ইমেল করতে পারে)
তারযুক্ত00

2

অন্যান্য উত্তরগুলি আপনার প্ল্যাটফর্মের উপর নির্ভর করে কাস্টম স্ক্রিপ্ট এবং সেটআপ দেওয়ার পক্ষে একটি ভাল কাজ করে। এগুলি ছাড়াও, আমি এখানে পরিপক্ক, বিশেষ উদ্দেশ্যে প্রোগ্রামগুলি জানি যা:

  • তনুকিসফটওয়্যার থেকে জেএসডাব্লু
  • YAJSW উপরের থেকে একটি ওপেন সোর্স ক্লোন। এটি জাভাতে লেখা হয়েছে, এবং এটি একটি আয়া প্রক্রিয়া যা কনফিগারেশন অনুসারে শিশু প্রক্রিয়া (আপনার কোড) পরিচালনা করে। উইন্ডোজ / লিনাক্সে কাজ করে।
  • জেএসভিসি একটি স্থানীয় অ্যাপ্লিকেশন। এটিও আয়া প্রক্রিয়া, তবে এটি জেএনআইয়ের মাধ্যমে সাব-প্রসেসের চেয়ে আপনার সন্তানের প্রয়োগের আবেদন করে।


1

থেকে বসন্ত বুট রেফারেন্স গাইড

Init.d পরিষেবা হিসাবে ইনস্টলেশন (সিস্টেম ভি)

কেবলমাত্র বয়াম সিমবলিক লিঙ্ক থেকে init.dমান সমর্থন করার জন্য start, stop, restartএবং statusকমান্ড। ধরে নেওয়া যে আপনার কাছে একটি স্প্রিং বুট অ্যাপ্লিকেশন ইনস্টল করা আছে / var / myapp এ, স্প্রিং বুট অ্যাপ্লিকেশনটি একটি init.d পরিষেবা হিসাবে ইনস্টল করতে কেবল একটি সিমিলিংক তৈরি করুন:

$ sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp

একবার ইনস্টল হয়ে গেলে, আপনি সাধারণ উপায়ে পরিষেবাটি শুরু করতে এবং বন্ধ করতে পারেন। উদাহরণস্বরূপ, একটি ডেবিয়ান ভিত্তিক সিস্টেমে:

$ service myapp start

ডগাযদি আপনার অ্যাপ্লিকেশন শুরু করতে ব্যর্থ হয় তবে /var/log/<appname>.logত্রুটির জন্য লিখিত ফাইলটি লিখিত পরীক্ষা করুন ।

কীভাবে একটি মোতায়েন করা পরিষেবা নিরাপদ করবেন তা জানতে পড়া চালিয়ে যান

লিখিত হিসাবে কাজ করার পরে আমি আবিষ্কার করেছি যে আমার পরিষেবা লগগুলিতে এই ত্রুটি বার্তাটি দিয়ে শুরু করতে ব্যর্থ হয়েছে: স্টার্ট-স্টপ-ডেমোন: অজানা বিকল্প - না-বন্ধ । এবং আমি /var/myapp/myapp.confনিম্নলিখিত বিষয়বস্তু দিয়ে একটি কনফিগার ফাইল তৈরি করে এটি ঠিক করতে পরিচালিত করেছি

USE_START_STOP_DAEMON=false

1

আমার নেটি জাভা অ্যাপ্লিকেশন রয়েছে এবং আমি এটি সিস্টেমযুক্ত সহ একটি পরিষেবা হিসাবে চালাতে চাই। দুর্ভাগ্যক্রমে অ্যাপ্লিকেশনটি আমি কী ধরণের ব্যবহার করছি তা বিবেচনা করেই থেমে যায়। শেষে আমি জাভা শুরু পর্দা আবরণ করেছি। কনফিগারেশন ফাইলগুলি এখানে:

সেবা

[Unit]
Description=Netty service
After=network.target
[Service]
User=user
Type=forking
WorkingDirectory=/home/user/app
ExecStart=/home/user/app/start.sh
TimeoutStopSec=10
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target

শুরু

#!/bin/sh
/usr/bin/screen -L -dmS netty_app java -cp app.jar classPath

যে বিন্দু থেকে আপনি ব্যবহার করতে পারেন systemctl [start|stop|status] service


1

জামন কোডটি ডেমন (পরিষেবা) হিসাবে চালাতে আপনি জেএনআই ভিত্তিক স্টাব লিখতে পারেন।

http://jnicookbook.owsiak.org/recipe-no-022/

জেএনআই ভিত্তিক একটি নমুনা কোডের জন্য। এই ক্ষেত্রে আপনি জাভা হিসাবে শুরু হওয়া কোডটি ডিমনাইজ করে এবং মূল লুপটি সিতে কার্যকর করা হয় তবে জাভাতে প্রধান, ডেমোন, পরিষেবা লুপ স্থাপন করাও সম্ভব।

https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo029

জেএনআই এর সাথে মজা করুন!


0

তবে একবার শুরু হয়ে গেলে কীভাবে এটি বন্ধ করতে আমি এটি অ্যাক্সেস করব জানি না

আপনি একটি সাধারণ স্টপ স্ক্রিপ্ট লিখতে পারেন যা আপনার জাভা প্রক্রিয়াটির জন্য গ্রেপ হয়, পিআইডি বের করে এবং এতে কল কিল হয়। এটি অভিনব নয়, এটি সরাসরি এগিয়ে। এই জাতীয় কিছু শুরু হিসাবে সহায়ক হতে পারে:

#!/bin/bash
PID = ps ax | grep "name of your app" | cut -d ' ' -f 1
kill $PID

2
আমি লিনাক্স খুব ভাল না কিন্তু pkill nameofprocessএকই জিনিস সম্পর্কে না ?
অস্বীকার করেন সাগুরেট

0

লিনাক্স পরিষেবা হিসাবে যুদ্ধ চালানো সম্ভব, এবং প্যাকেজিংয়ের আগে আপনি আপনার pom.xML ফাইলটিতে জোর করতে চাইতে পারেন, কারণ কিছু ডিস্ট্রো অটো মোডে স্বীকৃতি নাও দিতে পারে। এটি করার জন্য, বসন্ত-বুট-মাভেন-প্লাগইন প্লাগইনের অভ্যন্তরে নিম্নলিখিত বৈশিষ্ট্য যুক্ত করুন।

                    <embeddedLaunchScriptProperties>
                        <mode>service</mode>
                    </embeddedLaunchScriptProperties>

এরপরে, আপনার init.d সেটআপ করুন এর সাথে:

ln -s myapp.war /etc/init.d/myapp

এবং আপনি চালাতে সক্ষম হবেন

service myapp start|stop|restart

উইন্ডোজ পরিষেবা সহ আরও অনেক অপশন রয়েছে যা আপনি স্প্রিং বুট ডকুমেন্টেশনে খুঁজে পেতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.