Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java linux中的后台进程_Java_Linux_Sockets_Process - Fatal编程技术网

Java linux中的后台进程

Java linux中的后台进程,java,linux,sockets,process,Java,Linux,Sockets,Process,我已经开发了一个Java套接字服务器连接,工作正常 当从终端启动时,它从监听客户端开始。但当我关闭终端时,它就停止了监听 我需要继续,即使用户从jar文件启动的地方关闭了终端 如何在Linux中运行Java server socket应用程序作为后台进程?您是否尝试将&放在命令行的末尾? 例如: java -jar mySocketApp.jar & 您还可以使用bg和fg命令将进程发送到后台和前台。您可以通过CTRL+Z暂停正在运行的进程 查看本文:试试看 java -jar yo

我已经开发了一个Java套接字服务器连接,工作正常

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

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


如何在Linux中运行Java server socket应用程序作为后台进程?

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

java -jar mySocketApp.jar &
您还可以使用bgfg命令将进程发送到后台和前台。您可以通过CTRL+Z暂停正在运行的进程

查看本文:

试试看

 java -jar yourApp.jar &

&
将启动新的进程线程,我还没有对此进行测试,但如果它仍然不起作用,则在脚本文件中twite它,并以
&
启动我。在命令末尾添加
&
后,需要做一件至关重要的事情。进程仍链接到终端。运行java命令后,需要运行
disown

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

现在,您可以关闭终端。

有几种方法可以实现此目的:

  • nohupjava-server myApplication.jar>/log.txt
    -这非常简单。它只会将应用程序放在后台。这会起作用,但这不是一个很好的方法
  • 使用shell包装器和上面的或应用程序。许多开源项目都使用这种方法,对于大多数场景来说都很好。此外,它还可以包含在
    init.d
    中,并具有常规启动、停止和状态命令所需的运行级别。如果需要,我可以提供一个例子
  • 使用或构建您自己的守护程序服务器。同样,这两种产品都非常受欢迎、经过良好测试且可靠。并且可用于Linux和Windows!来自ApacheCommons的一个被Tomcat服务器使用!另外还有
  • 就我个人而言,如果您将来需要使用此服务器和/或将其分发给客户机、最终用户等,我会选择解决方案2或3。如果您需要运行某个程序,并且没有时间为该问题开发更复杂的解决方案,
    nohup
    是很好的选择

    广告2:

    可以找到许多项目使用的最佳脚本

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

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

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

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

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

    你需要担心的两件事是:

    • 从父进程分离
    • 从创建进程的tty分离
    如果你在谷歌上搜索“daemonizing a process”这个短语,你会找到很多方法来实现这一点,以及一些关于为什么有必要这样做的更多细节


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

    步骤1。

    创建新屏幕的步骤

    screen -RD screenname
    
    第2步。

    进入屏幕终端

    按回车键

    第3步。

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

    第4步。

    从屏幕终端出来

    ctrl+A+D

    第5步。

    列出屏幕终端

    screen -ls
    
    这将打印如下内容

    在以下位置有一个屏幕:
    994.screenname(2018年10月12日上午09:24:31)(独立)
    1个插座输入/运行/屏幕/S触点。

    第6步。

    要登录到后台进程

    screen -rd 994.screenname
    

    谢谢你的回答。我想选择方案2。如果你能给我举个例子,那个命令对我不起作用,我需要的是
    java-jaryourapp.jar>log.txt&
    使用ubuntu,而不是
    &