Linux에서 Java 응용 프로그램을 서비스로 실행 것입니다. 그러나 일단 시작되면 업데이트를 중지하고 업데이트를

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

시작하는 방법은 시작 rc.local 에 포함시키는 것입니다. 은 서버 스크립트에 포함시키는 것입니다. 그러나 일단 시작되면 업데이트를 중지하고 업데이트를 설치하려는 경우 액세스 방법을 모르므로 응용 프로그램을 다시 시작하려면 서버를 다시 시작해야합니다.

Windows PC에서 이러한 유형의 응용 프로그램에 대해 Windows 서비스를 만든 다음 원하는대로 중지하고 시작할 수 있습니다. Linux 상자에 이와 같은 것이 있습니까? 그래서이 응용 프로그램을 시작하면 서버를 완전히 다시 시작하지 않고도 응용 프로그램을 중지하고 다시 시작할 수 있습니다.

내 응용 프로그램은 WebServer.exe입니다. 다음 과 같이 rc.local 에 포함시켜 서버 시작시 시작됩니다 .

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

나는 리눅스에서 약간의 멍청한 놈이므로 어떤 예라도 모든 게시물로 높이 평가 될 것입니다. 그러나 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를 위해 전체 튜토리얼을 따라 할 수 여기 와 (우분투 16+) systemd를 위해 여기

출력 로그가 필요한 경우 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

그런 다음 중지 스크립트 stop.sh는 파일에서 PID를 읽고 응용 프로그램을 종료합니다.

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

물론 프로세스가 있는지 확인 pid.txt하고 완료되면 제거하는 등의 세부 정보를 생략했습니다 .


답변

Linux 서비스 초기화 스크립트는에 저장됩니다 /etc/init.d. /etc/init.d/skeleton파일을 복사 및 사용자 정의한 다음

service [yourservice] start|stop|restart

http://www.ralfebert.de/blog/java/debian_daemon/을 참조 하십시오 . 데비안 (우분투도)이지만 더 많은 배포판에 적합합니다.


답변

아마도 최고의 dev-ops 솔루션은 아니지만 lan party 또는 이와 유사한 서버를 일반적으로 사용하는 데 적합합니다.

사용 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 커뮤니티에서도 꽤 인기가 있습니다.


답변

참조 서비스로 봄 부팅 응용 프로그램 뿐만 아니라, 나는 갈 것 systemd이 가장 쉬운, 가장 적음, 그리고 가장 현대적인 배포판에 통합 (그리고 CentOS는 7.x와 같은도 그리 현대없는 것)을 이후 버전.