linux中的后台进程

时间:2012-02-24 12:11:49

标签: java linux sockets process

我开发了一个工作正常的Java套接字服务器连接。

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

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

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

6 个答案:

答案 0 :(得分:32)

有几种方法可以实现这样的目标:

  1. nohup java -server myApplication.jar > /log.txt - 这很简单。它只是将应用程序放在后台。这可行,但这不是一个非常好的方法。
  2. 使用shell包装器和上面的OR daemon应用。许多开源项目都使用这种方法,对大多数场景来说都很好。此外,它可以包含在init.d和所需的运行级别中,并具有常规的启动,停止和状态命令。如果需要,我可以提供一个例子。
  3. 使用Java Service WrapperApache Jakarta Commons Daemon构建您自己的守护程序服务器。再次 - 两者都非常受欢迎,经过良好测试和可靠。适用于Linux和Windows!来自Apache Commons的那个是Tomcat服务器使用的!此外还有Akuma
  4. 如果您将来需要使用此服务器和/或将其分发给客户端,最终用户等,我个人会选择解决方案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
    

答案 1 :(得分:5)

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

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

现在,您可以关闭终端。

答案 2 :(得分:3)

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

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

它完全是通用的,而不仅限于Java进程。

为了成为真正独立的守护进程,您需要执行几项任务。它们列在维基百科页面上。

您需要担心的两件事是:

  • 从父进程分离
  • 从创建过程的tty中分离

如果您使用“守护进程”这一短语,您将找到一系列方法来完成此操作,并提供一些更详细的信息,说明为什么必要。

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

答案 3 :(得分:1)

你试过把&在命令行的末尾? 例如:

java -jar mySocketApp.jar &

您还可以使用 bg fg 命令将进程发送到后台和前台。您可以通过 CTRL + Z 暂停正在运行的进程。

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

答案 4 :(得分:1)

试试,

 java -jar yourApp.jar &

&将启动新的进程线程,我还没有对此进行测试,但是如果它仍然不起作用,那么在脚本文件中将其旋转并以&启动我

答案 5 :(得分:0)

第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