Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Существует несколько способов достижения такой цели:

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

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

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

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

Для Debian/Ubuntu можно использовать очень простой script на основе 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

Ответ 2

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

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

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

Ответ 3

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

Итак, процесс отсоединения и становления подлинного серверного процесса называется "демонанизацией".

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

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

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

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

Если вы указали в Google фразу "daemonizing the process", вы найдете множество путей для этого и еще более подробную информацию о том, почему это необходимо.

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

Ответ 4

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

java -jar mySocketApp.jar &

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

Ознакомьтесь с этой статьей: http://lowfatlinux.com/linux-processes.html

Ответ 5

попробуйте,

 java -jar yourApp.jar &

& запустит новый поток процессов, я его не тестировал, но если он все еще не работает, верните его в файл script и запустите я с помощью &

Ответ 6

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