Запустить файл java jar на сервере в фоновом режиме

105

Мне нужно запустить java-банку на сервере, чтобы общаться между двумя приложениями. Я написал два сценария оболочки для его запуска, но как только я запускаю этот сценарий, я не могу завершить / завершить процесс. Если я нажму ctrl+ Cили закрою консоль, сервер выключится. Может ли кто-нибудь помочь мне изменить этот сценарий, чтобы он работал как обычный сервер?

 #!/bin/sh
java -jar /web/server.jar
echo $! 
#> startupApp.pid
Бернад Али
источник

Ответы:

242

Вы можете попробовать это:

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

Символ & переключает программу на работу в фоновом режиме.

Утилита nohup заставляет команду, переданную в качестве аргумента, запускаться в фоновом режиме даже после выхода из системы.

Антон Белоглазов
источник
Спасибо, Антон, сейчас я останавливаю сервер, убивая идентификатор процесса. Я не думаю, что это лучшая практика. Это команда, чтобы остановить сервер?
Бернад Али
3
Короткий ответ: это зависит от сервера. Длинный ответ: насколько мне известно, не существует безопасного способа завершить работу, если процесс не поддерживает такие плавные остановки. Например, если работа веб-сервера завершается внешним сигналом, всегда есть вероятность, что некоторые запросы будут потеряны. Одним из способов решения этой проблемы является реализация функции постепенного завершения на самом сервере, например, путем обработки запросов особого типа. Затем сервер может быть остановлен, отправив ему запрос особого типа. В противном случае проще всего убить процесс по его идентификатору.
Антон Белоглазов
1
Использование nohupвсегда должно сочетаться с перенаправлением stdout и stderr явным образом - в противном случае вы не получите контроля над тем, куда идут журналы, и в конечном итоге получите некрасивый, nohup.outсозданный в том каталоге, из которого этот скрипт вызывается.
Чарльз Даффи
@Anton, когда я запускаю скрипт (как и ваш ответ) с SSH EXEC runjar.sh. Он начал передавать журналы в мой локальный терминал, и если закрыть мой терминал, моя банка будет убита. Как я могу запустить jar в фоновом режиме с помощью SSH EXEC?
ААТИТ РАДЖЕНДРАН
48

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 / system /
Robbo_UK 03
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 startи service yourservice stopкоманду. Вы можете /var/log/yourservice.logпроверить, работает ли он.

Если вы просто хотите запустить jar-файл из консоли, не загромождая окно консоли, вы можете просто сделать:

java -jar /web/server.jar > /var/log/yourservice.log 2>&1
Стрелок
источник
3
Это служба systemd? Этот вопрос не помечен как linux, и очень немногие дистрибутивы имеют systemd по умолчанию.
jordanm
1
Я исправлю вопрос, чтобы сказать, что это использует "выскочку", которая включена в ubuntu.
Стрелок
1
Я считаю, что последний совет, если вы хотите, чтобы он работал в фоновом режиме и оболочка была выпущена, вам следует сделать: java -jar /web/server.jar > /var/log/yourservice.log 2>&1 &
Montaro
Все системные задания по умолчанию находятся в следующем каталоге: / etc / init / ... По умолчанию в Ubuntu 14.04 нет каталога / var / init /.
Майкл Лафайет,
Кроме того, для запуска службы требуется «sudo». sudo service yourservice start
Майкл Лафайет
2

Запустите в фоновом режиме и добавьте журналы в файл журнала, используя следующее:

nohup java -jar /web/server.jar > log.log 2>&1 &
KayV
источник