Запустіть файл jar 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 робить команду, передану як аргумент, виконуватись у фоновому режимі навіть після виходу з системи.


Дякую Антону, що зараз я зупиняю сервер, вбиваючи процес id.i не думаю, що це найкраща практика. Це команда для зупинки сервера?
Бернад Алі

3
Коротка відповідь: це залежить від сервера. Довга відповідь: наскільки я знаю, немає безпечного способу зупинити процес без процесу, який підтримує такі витончені зупинки роботи. Наприклад, якщо веб-сервер припиняється зовнішнім сигналом, завжди є можливість, що деякі запити будуть втрачені. Одним із способів вирішити цю проблему є реалізація витонченої функції припинення на самому сервері, наприклад, шляхом обробки запитів спеціального типу. Тоді сервер можна припинити, надіславши йому запит такого спеціального виду. В іншому випадку вбивство процесу за його ідентифікатором - простий спосіб.
Антон Белоглазов

1
Використання nohupзавжди повинно поєднуватися з явним перенаправленням stdout та stderr - інакше ви не отримуєте контролю над тим, куди ходять журнали, і в кінцевому підсумку з некрасивим, nohup.outствореним у тому каталозі, з якого цей сценарій буде викликаний.
Чарльз Даффі

@Anton, коли я запускаю сценарій (як і ваша відповідь) з SSH EXEC runjar.sh. Він почав передавати журнали в мій локальний термінал, і якщо закрити мій термінал, моя банка загине. Як я можу запустити банку у фоновому режимі за допомогою SSH EXEC?
АФАТ РАЙДЕНДРАН

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 image Мені довелося встановити systemd, потім знайшли зображення в / etc / systemd / system /
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 startі service yourservice stop. Можна /var/log/yourservice.logперевірити, чи працює він.

Якщо ви просто хочете запустити свою банку з консолі, не клацаючи вікно консолі, ви можете просто зробити:

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

3
Це системна послуга? Це питання не позначено тегами Linux, і за замовчуванням систематизовано дуже мало дистрибутивів.
Йорданм

1
Я поправлю питання, щоб сказати, що для цього використовується "upstart", який входить до ubuntu.
Стрілок

1
Я вважаю, що за останню пораду, якщо ви хочете, щоб вона працювала у фоновому режимі, і оболонка була випущена, вам слід зробити: java -jar /web/server.jar > /var/log/yourservice.log 2>&1 &
Монтаро

Усі системні завдання за замовчуванням живуть у наступній папці: / etc / init / ... За замовчуванням в Ubuntu 14.04 немає каталогу / var / init /.
Майкл Лафайєт

Також для запуску послуги потрібне "судо". Початок sudo service yourservice
Майкл Лафайєт,

2

Запустіть у фоновому режимі та додайте журнали до файлу журналу, використовуючи наступне:

nohup java -jar /web/server.jar > log.log 2>&1 &
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.