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/ 를 참조해 주세요.
상세 정보:
다음으로 셸 스크립트의 예를 나타냅니다(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.d
을start
,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
'programing' 카테고리의 다른 글
PHP dirname(_FILE__)에서 한 단계 위로 올라가는 방법 (0) | 2022.12.09 |
---|---|
코틀린의 개인 건설업자 (0) | 2022.12.09 |
!중요한 스타일 덮어쓰기 (0) | 2022.12.09 |
JSON을 CSV로 변환하려면 어떻게 해야 합니까? (0) | 2022.12.09 |
JUnit에서 regex 일치 항목 확인 (0) | 2022.12.09 |