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

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

23 голосов
/ 24 февраля 2012

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

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

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

Как запустить приложение сокета Java-сервера в Linuxв качестве фонового процесса?

Ответы [ 6 ]

32 голосов
/ 24 февраля 2012

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

  1. nohup java -server myApplication.jar > /log.txt - это довольно просто. Это просто поместит приложение в фоновом режиме. Это будет работать, но это не очень хороший способ сделать это.
  2. Используйте оболочку оболочки и указанное выше приложение OR daemon . Этот подход используется многими проектами с открытым исходным кодом, и он довольно хорош для большинства сценариев. Кроме того, он может быть включен в 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
6 голосов
/ 24 февраля 2012

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

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

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

3 голосов
/ 24 февраля 2012

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

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

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

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

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

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

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

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

1 голос
/ 24 февраля 2012

попробуй,

 java -jar yourApp.jar &

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

1 голос
/ 24 февраля 2012

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

java -jar mySocketApp.jar &

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

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

0 голосов
/ 10 декабря 2018

Шаг 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...