Uruchom plik jar java na serwerze jako proces w tle

105

Muszę uruchomić jar java na serwerze, aby komunikować się między dwiema aplikacjami. Napisałem dwa skrypty powłoki, aby go uruchomić, ale po uruchomieniu tego skryptu nie mogę zamknąć / zakończyć procesu. Jeśli naciśnę ctrl+ Club zamknę konsolę, serwer wyłączy się. Czy ktoś mógłby mi pomóc, jak zmodyfikować ten skrypt, aby działał jak normalny serwer?

 #!/bin/sh
java -jar /web/server.jar
echo $! 
#> startupApp.pid
Bernad Ali
źródło

Odpowiedzi:

242

Możesz spróbować tego:

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

Symbol & przełącza program do działania w tle.

Narzędzie nohup sprawia, że ​​polecenie przekazywane jako argument jest uruchamiane w tle nawet po wylogowaniu.

Anton Beloglazov
źródło
Dzięki Anton, obecnie zatrzymuję serwer przez zabicie identyfikatora procesu. Nie sądzę, że jest to najlepsza praktyka. Czy istnieje polecenie zatrzymania serwera?
Bernad Ali
3
Krótka odpowiedź: to zależy od serwera. Długa odpowiedź: o ile wiem, nie ma bezpiecznego sposobu na zamknięcie procesu bez procesu wspierającego takie bezpieczne zamykanie. Na przykład, jeśli jest to serwer WWW, który jest przerywany przez sygnał zewnętrzny, zawsze istnieje możliwość, że niektóre żądania zostaną utracone. Jednym ze sposobów rozwiązania tego problemu jest zaimplementowanie w samym serwerze wdzięcznej funkcji kończącej, np. Poprzez przetwarzanie specjalnego rodzaju żądań. Następnie serwer może zostać zakończony, wysyłając mu żądanie tego specjalnego rodzaju. W przeciwnym razie zabicie procesu za pomocą jego identyfikatora jest prostym sposobem.
Anton Beloglazov,
1
Używanie nohuppowinno zawsze być połączone z jawnym przekierowaniem stdout i stderr - w przeciwnym razie nie uzyskasz kontroli nad tym, gdzie trafiają dzienniki, i skończysz z brzydkim nohup.oututworzeniem w dowolnym katalogu, z którego ten skrypt zostanie wywołany.
Charles Duffy,
@Anton, kiedy uruchamiam skrypt (tak jak twoja odpowiedź) z SSH EXEC runjar.sh. Zaczęło przesyłać strumieniowo dzienniki na moim lokalnym terminalu i po zamknięciu mojego terminala mój jar zostaje zabity. Jak uruchomić jar w tle za pomocą SSH EXEC?
AATHITH RAJENDRAN
48

Systemd który obecnie działa w większości dystrybucji

Krok 1:

Znajdź swoje usługi zdefiniowane przez użytkownika, w których moja była /usr/lib/systemd/system/

Krok 2:

Utwórz plik tekstowy, nazwij go ulubionym edytorem tekstu whatever_you_want.service

Krok 3:

Umieść następujący szablon do plikuwhatever_you_want.service

[Unit]
Description=webserver Daemon

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

[Install]
WantedBy=multi-user.target

Krok 4:

Uruchom usługę
jako superużytkownik

$ 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
mtelesha
źródło
To jest nowoczesny sposób na zrobienie tego
EarthMind
4
na obrazie aws ubutnu musiałem zainstalować systemd, a następnie znalazłem obraz w / etc / systemd / system /
Robbo_UK
29

Jeśli używasz Ubuntu i masz „Upstart” ( http://upstart.ubuntu.com/ ), możesz spróbować tego:

Stwórz /var/init/yourservice.conf

z następującą treścią

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  

Teraz możesz wydawać polecenia service yourservice starti service yourservice stop. Możesz ogonić, /var/log/yourservice.logaby sprawdzić, czy działa.

Jeśli chcesz po prostu uruchomić jar z konsoli bez zapychania okna konsoli, możesz po prostu zrobić:

java -jar /web/server.jar > /var/log/yourservice.log 2>&1
Strelok
źródło
3
Czy to usługa systemowa? To pytanie nie jest otagowane jako linux, a bardzo niewiele dystrybucji ma domyślnie systemd.
jordanm
1
Poprawię pytanie, aby powiedzieć, że jest to „upstart”, który jest zawarty w ubuntu.
Strelok
1
Wierzę, że ostatnią radą, jeśli chcesz, aby działał w tle, a powłoka została wydana, powinieneś zrobić: java -jar /web/server.jar > /var/log/yourservice.log 2>&1 &
Montaro
Wszystkie zadania systemowe znajdują się domyślnie w następującym katalogu: / etc / init / ... Domyślnie w Ubuntu 14.04 nie ma katalogu / var / init /.
Michael Lafayette
Uruchomienie usługi wymaga również „sudo”. sudo service yourservice start
Michael Lafayette
2

Uruchom w tle i dodaj dzienniki do pliku dziennika, korzystając z:

nohup java -jar /web/server.jar > log.log 2>&1 &
KayV
źródło