我开发了一个Java套接字服务器连接,工作正常 .
从终端启动时,它从客户端侦听开始 . 但当我关闭终端时,它停止收听 .
我需要继续,即使终端由用户从jar文件启动的地方关闭 .
如何在Linux中运行Java服务器套接字应用程序作为后台进程?
有几种方法可以实现这样的目标:
nohup java -server myApplication.jar > /log.txt - 这很简单 . 它只是将应用程序放在后台 . 这可行,但这不是一个非常好的方法 .
nohup java -server myApplication.jar > /log.txt
使用shell包装器和上面的OR daemon应用程序 . 许多开源项目都使用这种方法,对大多数场景来说都很好 . 此外,它可以包含在 init.d 中,并且需要具有常规启动,停止和状态命令的运行级别 . 如果需要,我可以提供一个例子 .
init.d
使用Java Service Wrapper或Apache Jakarta Commons Daemon构建您自己的守护程序服务器 . 再次 - 两者都非常受欢迎,经过良好测试和可靠 . 适用于Linux和Windows!来自Apache Commons的那个是Tomcat服务器使用的!另外还有Akuma .
如果您将来需要使用此服务器和/或将其分发给客户端,最终用户等,我个人会选择解决方案2或3.如果您需要运行某些东西并且没有时间开发更复杂的解决方案,那么 nohup 是好的对于这个问题 .
nohup
广告2:
许多项目使用的最佳脚本可以在here找到 .
对于Debian / Ubuntu,可以使用基于 start-stop-daemon 的非常简单的脚本 . 如果有疑问,可以修改 /etc/init.d/skeleton .
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
在命令末尾添加 & 后,您需要做一件至关重要的事情 . 该过程仍与终端相关联 . 运行java命令后需要运行 disown .
&
disown
java -jar yourApp.jar > log.txt & disown
现在,您可以关闭终端 .
这里需要的关键词是“守护进程” . 有没有想过为什么系统服务器进程经常在Linux / Unix上以'd'结尾?由于历史原因,'d'代表“守护进程” .
因此,分离并成为真正的服务器进程的过程称为“守护进程” .
它完全是通用的,而不仅限于Java进程 .
为了成为真正独立的守护进程,您需要执行几项任务 . 它们列在维基百科页面上 .
您需要担心的两件主要事情是:
从父进程中分离
从创建进程的tty中分离
如果你谷歌“守护一个过程”这个短语,你会找到很多方法来实现这一点,并详细说明为什么它是必要的 .
大多数人只会使用一个小的shell脚本来启动java进程,然后使用'&'完成java命令以在后台模式下启动 . 然后,当启动脚本进程退出时,java进程仍在运行,并将从现在已死的脚本进程中分离出来 .
尝试,
java -jar yourApp.jar &
& 将启动新的进程线程,我还没有测试过这个,但是如果它仍然没有用,那么在脚本文件中将它旋转并用 & 启动
您是否尝试将&放在命令行的末尾?例如:
java -jar mySocketApp.jar &
您还可以使用 bg 和 fg 命令将进程发送到后台和前台 . 您可以通过CTRL Z暂停正在运行的进程 .
看看这篇文章:http://lowfatlinux.com/linux-processes.html
Step 1.
创建新屏幕
screen -RD screenname
Step 2.
进入屏幕终端
press Enter
Step 3.
在新打开的终端中运行您的命令或脚本(在后台运行)
Step 4.
走出屏幕终端
ctrl + A + D
Step 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.
Step 6.
要登录后台进程
screen -rd 994.screenname
6 回答
有几种方法可以实现这样的目标:
nohup java -server myApplication.jar > /log.txt
- 这很简单 . 它只是将应用程序放在后台 . 这可行,但这不是一个非常好的方法 .使用shell包装器和上面的OR daemon应用程序 . 许多开源项目都使用这种方法,对大多数场景来说都很好 . 此外,它可以包含在
init.d
中,并且需要具有常规启动,停止和状态命令的运行级别 . 如果需要,我可以提供一个例子 .使用Java Service Wrapper或Apache Jakarta Commons Daemon构建您自己的守护程序服务器 . 再次 - 两者都非常受欢迎,经过良好测试和可靠 . 适用于Linux和Windows!来自Apache Commons的那个是Tomcat服务器使用的!另外还有Akuma .
如果您将来需要使用此服务器和/或将其分发给客户端,最终用户等,我个人会选择解决方案2或3.如果您需要运行某些东西并且没有时间开发更复杂的解决方案,那么
nohup
是好的对于这个问题 .广告2:
许多项目使用的最佳脚本可以在here找到 .
对于Debian / Ubuntu,可以使用基于
start-stop-daemon
的非常简单的脚本 . 如果有疑问,可以修改/etc/init.d/skeleton
.在命令末尾添加
&
后,您需要做一件至关重要的事情 . 该过程仍与终端相关联 . 运行java命令后需要运行disown
.现在,您可以关闭终端 .
这里需要的关键词是“守护进程” . 有没有想过为什么系统服务器进程经常在Linux / Unix上以'd'结尾?由于历史原因,'d'代表“守护进程” .
因此,分离并成为真正的服务器进程的过程称为“守护进程” .
它完全是通用的,而不仅限于Java进程 .
为了成为真正独立的守护进程,您需要执行几项任务 . 它们列在维基百科页面上 .
您需要担心的两件主要事情是:
从父进程中分离
从创建进程的tty中分离
如果你谷歌“守护一个过程”这个短语,你会找到很多方法来实现这一点,并详细说明为什么它是必要的 .
大多数人只会使用一个小的shell脚本来启动java进程,然后使用'&'完成java命令以在后台模式下启动 . 然后,当启动脚本进程退出时,java进程仍在运行,并将从现在已死的脚本进程中分离出来 .
尝试,
&
将启动新的进程线程,我还没有测试过这个,但是如果它仍然没有用,那么在脚本文件中将它旋转并用&
启动您是否尝试将&放在命令行的末尾?例如:
您还可以使用 bg 和 fg 命令将进程发送到后台和前台 . 您可以通过CTRL Z暂停正在运行的进程 .
看看这篇文章:http://lowfatlinux.com/linux-processes.html
Step 1.
创建新屏幕
Step 2.
进入屏幕终端
press Enter
Step 3.
在新打开的终端中运行您的命令或脚本(在后台运行)
Step 4.
走出屏幕终端
ctrl + A + D
Step 5.
列出屏幕终端
这将打印如下所示
There is a screen on: 994.screenname (12/10/2018 09:24:31 AM) (Detached) 1 Socket in /run/screen/S-contact.
Step 6.
要登录后台进程