Linux中的后台进程

23

我已经开发了一个Java套接字服务器连接,它运行良好。

当从终端启动时,它开始侦听客户端。但是,当我关闭终端时,它停止侦听。

我需要即使从启动jar文件的终端被用户关闭,也能够继续运行。

如何在Linux中将Java服务器套接字应用程序作为后台进程运行?


https://dev59.com/QkvSa4cB1Zd3GeqPfpvD - tMC
7个回答

32

有几种方法可以实现这样的事情:

  1. nohup java -server myApplication.jar > /log.txt - 直截了当,只是将应用程序放在后台。 这个方法可行,但不是很好。
  2. 使用shell包装器和上述方法,或者daemon app。许多开源项目都使用这种方法,适用于大多数情况。此外,它可以包含在init.d中,并要求常规启动,停止和状态命令的运行级别。如果需要,我可以提供示例。
  3. 使用Java Service WrapperApache Jakarta Commons Daemon构建自己的守护程序服务器。 同样 - 两者都非常受欢迎,经过充分测试和可靠。 并且适用于Linux和Windows! 来自Apache Commons的守护程序被Tomcat服务器使用! 此外还有Akuma

就我个人而言,如果您需要在将来使用此服务器和/或将其分发给客户、最终用户等,则会选择方案2或3。 如果您需要运行某些东西并且没有时间为问题开发更复杂的解决方案,则可以使用nohup

关于第二种方法:

最好的脚本可在此处找到,许多项目都在使用它。

对于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

Rzanek,感谢您的回答。我想选择选项2。如果您能提供一个例子给我就太好了。 - user861973

6
在命令末尾添加&后,您需要执行一个关键步骤。该进程仍与终端连接。运行java命令后,您需要运行 disown 。
java -jar yourApp.jar > log.txt &
disown

现在,您可以关闭终端。

1
那个命令对我没用,我需要在Ubuntu上使用java -jar yourApp.jar > log.txt &而不是在结尾加上& - wired00

3
您需要的关键词是“守护进程化”。你是否想知道为什么Linux/Unix系统服务器进程通常以“d”结尾?这是由于历史原因,“d”代表“守护进程”。将进程分离并成为真正的服务器进程的过程称为“守护进程化”。
这完全是通用的,并不限于Java进程。
要成为真正独立的守护进程,您需要执行几个任务。它们在维基百科页面上列出。
你需要关心的两件事情是:
- 从父进程中分离 - 从创建进程的tty中分离
如果你谷歌搜索“守护进程化”,你会发现有很多方法来实现这个目标,也会了解更多为什么需要它。
大多数人会使用一个小shell脚本来启动Java进程,然后在Java命令后面加上“&”以启动后台模式。然后,当启动脚本进程退出时,Java进程仍在运行,并且与已死的脚本进程分离。

2

尝试,

 java -jar yourApp.jar &
&将启动新的进程线程。我还没有测试过,但如果仍然无法正常工作,则在脚本文件中使用&启动它。

1
你尝试在命令行的末尾加上 & 吗? 例如:
java -jar mySocketApp.jar &

你还可以使用 bgfg 命令将进程发送到后台和前台。你可以通过按下CTRL+Z来暂停正在运行的进程。

查看这篇文章: http://lowfatlinux.com/linux-processes.html


0

对于我来说,运行终端并使进程在后台持续运行的简单快捷方式是在命令末尾使用&!

  • 如果此应用程序是为X服务器构建的:(例如:Firefox,Zathura,Gimp ...)
$ java -jar yourApp.jar &!
  • 如果这个应用程序是CLI(在终端上工作)
# st is my terminal like kitty alacritty
$ st -e bash -c "lookatme --style one-dark --one $1" &!

0

步骤 1。

创建新屏幕

screen -RD screenname

步骤2。

进入屏幕终端

按Enter键

步骤3。

在新打开的终端中运行您的命令或脚本(在后台运行)

步骤4。

退出屏幕终端

ctrl + A + D

步骤5。

列出屏幕终端

screen -ls

将会打印出类似以下的内容

屏幕上有: 994.screenname (12/10/2018 09:24:31 AM) (已分离) /run/screen/S-contact 中有1个套接字。

步骤6.

登录到后台进程

screen -rd 994.screenname

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接