2012-02-24 32 views
22

我开发了一个工作正常的Java套接字服务器连接。在Linux中的后台进程

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

即使用户从jar文件的启动位置关闭了终端,我仍然需要继续。

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

+0

http://stackoverflow.com/questions/2151214/is-it-possible-to-double-fork-a-process-in-java – tMC 2012-02-24 15:19:44

回答

30

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

  1. nohup java -server myApplication.jar > /log.txt - 这是相当直截了当。它只会将应用程序置于后台。这会起作用,但这不是一个很好的方式。
  2. 使用外壳包装和上面的OR daemon应用程序。这种方法被许多开源项目所使用,并且对于大多数场景来说都非常有用。此外,它可以包含在init.d以及所需的运行级别中,并具有常规的启动,停止和状态命令。如果需要,我可以提供一个例子。
  3. 使用Java Service WrapperApache Jakarta Commons Daemon构建您自己的守护程序服务器。再次 - 两者都非常受欢迎,经过充分测试和可靠。并可用于Linux和Windows! Tomcat服务器使用Apache Commons中的一个!另外还有Akuma

我个人用的解决方案2或3去,如果你需要在未来使用此服务器和/或分发到客户,最终用户等nohup是好的,如果你需要运行的东西,并没有有时间为这个问题开发更复杂的解决方案。

广告2:

最好的剧本,很多项目使用,可以发现here

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

Rzanek谢谢你的回答。我想选择2,如果你能给我一个例子。 – user861973 2012-03-01 12:16:51

1

您是否尝试在命令行的末尾放置&? 例如:

java -jar mySocketApp.jar & 

您还可以使用BGFG命令进程发送到后台和前台。您可以通过CTRL + Z暂停运行过程。

检查出来这篇文章:http://lowfatlinux.com/linux-processes.html

1

尝试,

java -jar yourApp.jar & 

&将启动新的进程的线程,我没有测试过这一点,但如果它仍然不工作,然后twite它在脚本文件从&开始

5

在命令末尾添加&之后,您需要做一件重要的事情。该过程仍然与终端相关联。运行java命令后需要运行disown

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

现在,您可以关闭终端。

+1

该命令不适合我我需要'java -jar yourApp .jar> log.txt&'使用ubuntu,而不是'&'在末端 – wired00 2016-07-06 13:16:41

3

您需要的关键短语是“守护进程”。有没有想过为什么系统服务器进程通常以Linux/Unix上的'd'结尾?由于历史原因,'d'代表“守护进程”。

因此,分离并成为真正的服务器进程的过程称为“守护进程”。

这是完全一般的,并不仅限于Java过程。

为了成为一个真正独立的守护进程,您需要完成几项任务。他们在维基百科页面上列出。

你需要担心的两两件事是:

    从父进程
  • 从创建过程

如果谷歌那句“daemonizing tty的拆离

  • 分离一个过程“,你会发现一系列的方法来完成这一点,以及更多的细节,为什么它是必要的。

    大多数人只会使用一个小小的shell脚本启动java进程,然后用'&'完成java命令以后台模式启动。然后,当启动脚本进程退出时,java进程仍在运行,并将从现在已死的脚本进程中分离出来。