it-swarm.com.ru

Фоновый процесс в Linux

Я разработал соединение с сокетом Java, которое работает нормально.

Когда запускается из терминала, он начинается с прослушивания от клиента. Но когда я закрываю терминал, он перестает слушать.

Мне нужно продолжить, хотя терминал закрыт пользователем, откуда был запущен файл jar.

Как я могу запустить приложение сокета Java сервера в Linux как фоновый процесс?

23
user861973

Есть несколько способов достичь такой цели:

  1. Nohup Java -server myApplication.jar > /log.txt - это довольно просто. Это просто поместит приложение в фоновом режиме. Это будет работать, но это не очень хороший способ сделать это.
  2. Используйте оболочку оболочки и выше OR daemon app. Этот подход используется во многих проектах с открытым исходным кодом, и он довольно хорош для большинства сценариев. Кроме того, он может быть включен в init.d и требуемый уровень запуска с регулярными командами запуска, остановки и состояния. Я могу привести пример, если это необходимо.
  3. Создайте свой собственный демон-сервер, используя Java Service Wrapper или Apache Jakarta Commons Daemon . Опять же - оба очень популярны, хорошо проверены и надежны. И доступно как для Linux, так и для Windows! Один из Apache Commons используется сервером Tomcat! Дополнительно есть Акума .

Лично я бы выбрал решение 2 или 3, если вам нужно использовать этот сервер в будущем и/или распространять его среди клиентов, конечных пользователей и т.д. Nohup хорош, если вам нужно что-то запустить и у вас нет времени на разработку более сложного решения. для проблемы.

Объявление 2:

Лучшие сценарии, используемые во многих проектах, можно найти здесь

Для Debian/Ubuntu можно использовать очень простой скрипт на основе start-stop-daemon. Если есть сомнения, есть /etc/init.d/skeleton, который можно изменить.

#!/bin/sh

DESC="Description"
NAME=YOUR_NAME
PIDFILE=/var/run/$NAME.pid
RUN_AS=USER_TO_RUN
COMMAND=/usr/bin/Java -- -jar YOUR_JAR

d_start() {
    start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE --chuid $RUN_AS --exec $COMMAND
}

d_stop() {
    start-stop-daemon --stop --quiet --pidfile $PIDFILE
    if [ -e $PIDFILE ]
        then rm $PIDFILE
    fi
}

case $1 in
    start)
    echo -n "Starting $DESC: $NAME"
    d_start
    echo "."
    ;;
    stop)
    echo -n "Stopping $DESC: $NAME"
    d_stop
    echo "."
    ;;
    restart)
    echo -n "Restarting $DESC: $NAME"
    d_stop
    sleep 1
    d_start
    echo "."
    ;;
    *)
    echo "usage: $NAME {start|stop|restart}"
    exit 1
    ;;
esac

exit 0
31
Łukasz Rżanek

Есть одна важная вещь, которую вам нужно сделать после добавления & в конце команды. Процесс все еще связан с терминалом. Вам нужно запустить disown после запуска команды Java.

Java -jar yourApp.jar > log.txt &
disown

Теперь вы можете закрыть терминал.

5
skyronic

Ключевая фраза, которая вам нужна, - «демонизация процесса». Когда-нибудь задумывались, почему процессы системного сервера часто заканчиваются на 'd' в Linux/Unix? «D» означает «демон» по историческим причинам. 

Таким образом, процесс отсоединения и превращения в настоящий серверный процесс называется «демонизация».

Он полностью общий и не ограничивается только процессами Java.

Есть несколько задач, которые необходимо выполнить, чтобы стать по-настоящему независимым процессом демона. Они перечислены на странице Википедии.

Две основные вещи, о которых вам нужно беспокоиться:

  • Отделить от родительского процесса
  • Отсоединиться от tty, который создал процесс

Если вы воспользуетесь фразой «демонизировать процесс», вы найдете множество способов сделать это и более подробную информацию о том, почему это необходимо. 

Большинство людей просто используют небольшой сценарий Shell для запуска процесса Java, а затем заканчивают команду Java с помощью «&» для запуска в фоновом режиме. Затем, когда завершается процесс сценария запуска, процесс Java все еще выполняется и будет отсоединен от уже мертвого процесса сценария.

3
kittylyst

Вы пытались поставить & в конце командной строки? Например:

Java -jar mySocketApp.jar &

Вы также можете использовать команды bg и fg для отправки процесса в фоновый и передний план. Вы можете приостановить запущенный процесс с помощью CTRL + Z.

Проверьте это в этой статье: http://lowfatlinux.com/linux-processes.html

1
Ata S.

пытаться, 

 Java -jar yourApp.jar &

& запустит новый поток процесса, я не проверял это, но если все еще это не работает, тогда перепишите это в файле сценария и запустите i с &

1
Nirmal- thInk beYond

Шаг 1.

Создать новый экран

screen -RD screenname

Шаг 2.

Для входа в экран терминала

press Enter

Шаг 3.

Запустите вашу команду или скрипт (для запуска в фоновом режиме) во вновь открытом терминале

Шаг 4.

Выйти из экрана терминала

ctrl + A + D

Шаг 5.

Чтобы отобразить экранные терминалы

screen -ls

это напечатает что-то вроде ниже

There is a screen on: 994.screenname (12/10/2018 09:24:31 AM) (Detached) 1 Socket in /run/screen/S-contact.

Шаг 6.

Для входа в фоновый процесс

screen -rd 994.screenname
0
SuperNova