programing

Linux에서 Java Application as a Service 실행

procenter 2022. 12. 9. 22:16
반응형

Linux에서 Java Application as a Service 실행

표준 가상 호스팅 Linux 솔루션에서 실행되는 Java 서버 애플리케이션을 작성했습니다.애플리케이션은 항상 소켓 연결을 수신하고 소켓 연결을 위한 새 핸들러를 만듭니다.클라이언트 서버 애플리케이션에 대한 서버 측 구현입니다.

시작 방법은 서버의 시작 rc.local 스크립트에 포함시키는 것입니다.다만, 기동 후에는, 액세스 해 정지하는 방법과 갱신을 인스톨 하는 방법을 알 수 없기 때문에, 애플리케이션을 재기동하기 위해서 서버를 재기동할 필요가 있습니다.

Windows PC 에서는, 이 타입의 애플리케이션을 위해서 Windows 서비스를 작성한 후, 필요에 따라서 정지 및 기동할 수 있습니다.이 애플리케이션을 기동하면, 서버를 완전하게 재기동하지 않고 정지하고 재기동할 수 있도록, Linux 박스에 그러한 기능이 있습니까.

제 어플리케이션 이름은 WebServer.exe입니다.다음과 같이 서버 부팅 시 rc.local에 포함시킴으로써 시작됩니다.

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

저는 Linux를 잘 모르기 때문에 어떤 게시물에도 예시를 들어주시면 감사하겠습니다.단, SSH와 업데이트 설치 및 Plesk 패널에 대한 액세스를 위한 완전한 FTP 액세스 권한이 있습니다.

여기에 또 다른 간단한 포장지를 썼습니다.

#!/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(ubuntu 16+)에 대한 전체 튜토리얼을 따라 할 수 있습니다.

는, 「」를 해 주세요.2

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

의 행.

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

간단한 해결책은 nohup을 통해 Java를 실행하고 PID를 파일에 저장하는 스크립트 start.sh을 작성하는 것입니다.

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

그러면 정지 스크립트가 정지됩니다.sh는 파일에서 PID를 읽고 응용 프로그램을 종료합니다.

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

그 이 있는지 하고 제거해 주는 등의 사항은.pid.txt면면면면면면면

에 됩니다./etc/init.d 및 커스터마이즈 할 수 /etc/init.d/skeleton, call, call, call, call 。

service [yourservice] start|stop|restart

http://www.ralfebert.de/blog/java/debian_daemon/ 를 참조해 주세요.이것은 Debian(Ubuntu)을 위한 것이지만, 더 많은 유통에 적합합니다.

최적의 dev-ops 솔루션은 아니지만 LAN 파티 등의 일반적인 서버 사용에는 적합합니다.

screen서버를 실행한 후 로그아웃하기 전에 분리하면 프로세스가 계속 실행되며 언제든지 다시 시작할 수 있습니다.

워크플로우:

기동합니다.screen

부팅합니다.java -jar minecraft-server.jar

떼어냅니다.Ctl-a,d

: 접: :screen -r

자세한 내용은 이쪽:https://www.gnu.org/software/screen/manual/screen.html

또 다른 대안으로는 Java Service Wrapper가 있습니다.이것은 OSS 커뮤니티에서도 꽤 인기가 있습니다.

Spring Boot 애플리케이션 as a Service에 대해서도 언급하면systemd최신 디스트로(CentOS 7.x와 같은 그다지 현대적이지 않은 디스트로도 포함)에 가장 쉽고, 가장 알기 쉽고, 가장 잘 통합되기 때문입니다.

은 '우리'를 사용하는 입니다.supervisord자세한 것은, http://supervisord.org/ 를 참조해 주세요.

상세 정보:

https://askubuntu.com/questions/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

다음으로 셸 스크립트의 예를 나타냅니다(MATH 이름을 어플리케이션 이름으로 치환해 주세요).

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

Spring Boot as a Service에서 Python 기반의supervisord해 주세요.자세한 내용은 스택오버플로우 질문을 참조해 주세요.셋업은 매우 간단합니다.

다른 답변은 플랫폼에 따라 커스텀스크립트와 셋업을 제공하는 데 도움이 됩니다.이와 더불어 제가 알고 있는 성숙하고 특별한 목적의 프로그램은 다음과 같습니다.

  • Tanuki Software의 JSW
  • YAJSW는 위의 오픈 소스 클론입니다.Java로 작성되어 있으며 구성에 따라 자녀 프로세스(코드)를 관리하는 유모 프로세스입니다.Windows/Linux에서 동작합니다.
  • JSVC는 네이티브 어플리케이션입니다.유모 과정이기도 하지만 하위 과정이 아닌 JNI를 통해 자녀 지원서를 호출합니다.

Java 서비스와 통신하기 위해 Thrift 서버 또는 JMX를 사용할 수 있습니다.

스프링 부트 레퍼런스 가이드에서

init.d 서비스로 설치(시스템 V)

으로 연결하기만 하면 됩니다.init.dstart,stop,restart ★★★★★★★★★★★★★★★★★」status명령어를 지정합니다. 어플리케이션이 spring Boot var/myapp Spring Boot " symlink " initd " " 를 생성하기만 하면 .

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

설치가 완료되면 일반적인 방법으로 서비스를 시작 및 중지할 수 있습니다.예를 들어 Debian 기반 시스템의 경우:

$ service myapp start

팁. 응용 프로그램 부팅에 실패하면 다음 로그파일을 확인합니다./var/log/<appname>.log에러에 대해서는, 을 참조해 주세요.

배포된 서비스를 보호하는 방법에 대해서는 계속 읽어보십시오.

기술된 대로 실행한 후 로그에서 서비스가 시작되지 않고 start-stop-daemon: unrecognized option --no-close라는 오류 메시지가 표시됩니다.그리고 구성 파일을 만들어 수정했습니다./var/myapp/myapp.conf다음과 같은 내용으로

USE_START_STOP_DAEMON=false

Linux 서비스로 war를 실행할 수 있습니다.일부 distros는 auto 모드에서 인식하지 못할 수 있으므로 패키징 전에 pom.xml 파일을 강제로 삽입하는 것이 좋습니다.이를 수행하려면 spring-boot-maven-plugin 플러그인 내부에 다음 속성을 추가합니다.

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

다음으로 init.d를 다음과 같이 설정합니다.

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

그리고 당신은 달릴 수 있을 것이다.

service myapp start|stop|restart

Spring Boot 매뉴얼에는 Windows 서비스 등 다양한 옵션이 있습니다.

저는 Netty java 어플리케이션을 가지고 있는데 systemd에서 서비스로 실행하고 싶습니다.안타깝게도 사용하는 타입에 관계없이 어플리케이션이 정지됩니다.마지막으로 java start in screen을 정리했습니다.설정 파일은 다음과 같습니다.

서비스

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

Java 코드를 데몬(서비스)으로 실행하려면 JNI 기반의 stub을 작성합니다.

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

JNI에 기반한 샘플코드의 경우.이 경우 Java로 시작된 코드를 데몬화하고 C에서 메인루프가 실행됩니다.그러나 자바 내부에 메인 데몬 서비스 루프를 삽입하는 것도 가능합니다.

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

JNI와 즐거운 시간 보내세요!

그러나 한번 시작하면 어떻게 접속해야 멈출 수 있는지 모르겠다.

Java 프로세스에 대해 grep하고 PID를 추출하여 콜 킬을 호출하는 간단한 중지 스크립트를 작성할 수 있습니다.화려하지는 않지만, 직설적입니다.우선 다음과 같은 것이 도움이 될 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/11203483/run-a-java-application-as-a-service-on-linux

반응형