백그라운드 프로세스로 서버에서 Java jar 파일 실행


105

두 응용 프로그램간에 통신하려면 서버에서 Java jar를 실행해야합니다. 실행하기 위해 두 개의 셸 스크립트를 작성했지만 해당 스크립트를 시작하면 프로세스를 종료 / 종료 할 수 없습니다. ctrl+를 누르 C거나 콘솔을 닫으면 서버가 종료됩니다. 아무도이 스크립트를 일반 서버로 실행하도록 수정하는 방법을 도와 줄 수 있습니까?

 #!/bin/sh
java -jar /web/server.jar
echo $! 
#> startupApp.pid

답변:


242

이것을 시도 할 수 있습니다.

#!/bin/sh
nohup java -jar /web/server.jar &

& 기호는 프로그램이 백그라운드에서 실행되도록 전환합니다.

nohup 유틸리티는 로그 아웃 한 후에도 백그라운드에서 인수로 전달 된 명령을 실행합니다.


고맙습니다 Anton, 프로세스 ID를 죽여서 서버를 중지 시켰습니다. 모범 사례라고 생각하지 않습니다. 서버를 중지하라는 명령입니까?
Bernad Ali

3
짧은 대답 : 서버에 따라 다릅니다. 긴 대답 : 내가 아는 한, 그러한 단계적 종료를 지원하는 프로세스 없이는 프로세스를 종료하는 안전한 방법이 없습니다. 예를 들어 웹 서버가 외부 신호에 의해 종료되는 경우 항상 일부 요청이 손실 될 가능성이 있습니다. 이 문제를 해결하는 한 가지 방법은 서버 자체에서 예를 들어 특별한 종류의 요청을 처리하여 정상 종료 기능을 구현하는 것입니다. 그런 다음 특별한 종류의 요청을 보내 서버를 종료 할 수 있습니다. 그렇지 않으면 ID로 프로세스를 종료하는 것이 간단한 방법입니다.
Anton Beloglazov 2012 년

1
using nohup은 항상 stdout 및 stderr를 명시 적으로 리디렉션하는 것과 결합되어야합니다 nohup.out.
Charles Duffy

SSH EXEC runjar.sh로 스크립트를 실행할 때 @Anton (당신의 대답과 마찬가지로). 내 로컬 터미널에서 로그를 스트리밍하기 시작했으며 터미널을 닫으면 항아리가 죽습니다. SSH EXEC를 사용하여 백그라운드에서 jar를 어떻게 실행할 수 있습니까?
AATHITH RAJENDRAN

47

Systemd 지금 배포판의 대부분에서 실행

1 단계:

내 사용자 정의 서비스 찾기 /usr/lib/systemd/system/

2 단계:

좋아하는 텍스트 편집기로 텍스트 파일을 만듭니다. whatever_you_want.service

3 단계 :

다음 템플릿 을 파일에 넣기 whatever_you_want.service

[Unit]
Description=webserver Daemon

[Service]
ExecStart=/usr/bin/java -jar /web/server.jar
User=user

[Install]
WantedBy=multi-user.target

4 단계 :

슈퍼 사용자로 서비스 실행

$ systemctl start whatever_you_want.service # starts the service
$ systemctl enable whatever_you_want.service # auto starts the service
$ systemctl disable whatever_you_want.service # stops autostart
$ systemctl stop whatever_you_want.service # stops the service
$ systemctl restart whatever_you_want.service # restarts the service

이것이 현대적인 방법입니다
EarthMind

4
AWS ubutnu 이미지를 그때 systemd을 / etc / systemd / 시스템에서 이미지를 찾아 설치해야했습니다 /
Robbo_UK

29

Ubuntu를 사용 중이고 "Upstart"( http://upstart.ubuntu.com/ )가있는 경우 다음을 시도 할 수 있습니다.

창조하다 /var/init/yourservice.conf

다음 내용으로

description "Your Java Service"  
author "You"  

start on runlevel [3]  
stop on shutdown  

expect fork  

script     
    cd /web 
    java -jar server.jar >/var/log/yourservice.log 2>&1  
    emit yourservice_running  
end script  

이제 service yourservice startservice yourservice stop명령을 실행할 수 있습니다 . /var/log/yourservice.log작동하는지 확인하기 위해 꼬리 를 달 수 있습니다 .

콘솔 창을 호깅하지 않고 콘솔에서 jar를 실행하려면 다음을 수행하면됩니다.

java -jar /web/server.jar > /var/log/yourservice.log 2>&1

3
시스템화 된 서비스입니까? 이 질문은 linux 태그가 없으며 기본적으로 시스템화 된 배포판은 거의 없습니다.
jordanm

1
나는 이것이 우분투에 포함 된 "upstart"를 사용하고 있다고 말하도록 질문을 수정할 것입니다.
Strelok

1
나는 그것이 백그라운드에서 실행되기를 원하고 쉘이 릴리스 되었으면하는 마지막 조언을 믿습니다. java -jar /web/server.jar > /var/log/yourservice.log 2>&1 &
Montaro

기본적으로 모든 시스템 작업은 다음 디렉토리에 있습니다. / etc / init / ... 기본적으로 Ubuntu 14.04에는 / var / init / 디렉토리가 없습니다.
Michael Lafayette

또한 서비스를 시작하려면 "sudo"가 필요합니다. sudo 서비스 yourservice 시작
Michael Lafayette

2

백그라운드에서 실행하고 다음을 사용하여 로그 파일에 로그를 추가합니다.

nohup java -jar /web/server.jar > log.log 2>&1 &
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.