Фоновый процесс в Linux
Я разработал соединение сервера сокетов Java, которое работает нормально.
При запуске с терминала он начинается с прослушивания с клиента. Но когда я закрываю терминал, он перестает слушать.
Мне нужно продолжить, даже если терминал закрыт пользователем, откуда был запущен файл jar.
Как запустить приложение сокета Java-сервера в Linux в качестве фонового процесса?
Ответы
Ответ 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