代码之家  ›  专栏  ›  技术社区  ›  Rich Apodaca

如何对Java程序进行后台编程?

  •  69
  • Rich Apodaca  · 技术社区  · 15 年前

    我有一个Java程序,我想在Linux系统上进行后台编程。换句话说,我想开始在shell中运行它,并在注销后让它继续运行。我也希望能够干净地停止程序。

    我发现 this article 它使用shell脚本和Java代码的组合来达到这个目的。它看起来不错,但如果可能的话,我想要简单一点的。

    在Linux系统中,你最喜欢的一个程序是什么?

    11 回复  |  直到 6 年前
        1
  •  37
  •   Verhagen    9 年前

    Apache Commons Daemon 将运行您的Java程序作为Linux守护进程或WINNT服务。

        2
  •  32
  •   agweber    7 年前

    如果你不能依靠 Java Service Wrapper 引用 elsewhere (例如,如果您在没有软件包版本的Ubuntu上运行,那么您可能希望使用传统的方法:让您的程序在/var/run/$progname.pid中写入其pid,并在其周围编写一个标准的sysv in it脚本(例如ntpd的脚本,很简单)。最好让它也符合LSB。

    本质上,启动函数测试程序是否已经运行(通过测试是否存在/var/run/$progname.pid,并且该文件的内容是正在运行的进程的pid),如果没有运行

    logfile=/var/log/$progname.log
    pidfile=/var/run/$progname.pid
    nohup java -Dpidfile=$pidfile $jopts $mainClass </dev/null > $logfile 2>&1
    

    停止函数检查/VAR/Run/$PrimNAM.PID,测试该文件是否是正在运行的进程的PID,验证它是Java VM(这样就不会杀死从Java Java守护进程的简单实例中重用PID)的进程,然后杀死该进程。

    调用时,我的main()方法将首先在system.getproperty(“pid file”)中定义的文件中写入其pid。

    一个主要障碍是:在Java中,没有简单和标准的方法来获得JVM运行的过程的PID。

    我想到的是:

    private static String getPid() {
        File proc_self = new File("/proc/self");
        if(proc_self.exists()) try {
            return proc_self.getCanonicalFile().getName();
        }
        catch(Exception e) {
            /// Continue on fall-back
        }
        File bash = new File("/bin/bash");
        if(bash.exists()) {
            ProcessBuilder pb = new ProcessBuilder("/bin/bash","-c","echo $PPID");
            try {
                Process p = pb.start();
                BufferedReader rd = new BufferedReader(new InputStreamReader(p.getInputStream()));
                return rd.readLine();
            }
            catch(IOException e) {
                return String.valueOf(Thread.currentThread().getId());
            }
        }
        // This is a cop-out to return something when we don't have BASH
        return String.valueOf(Thread.currentThread().getId());
    }
    
        3
  •  23
  •   Ben Hardy    15 年前

    如果我想:

    1. 运行一个不受叹息影响的程序
    2. 与产生它的外壳完全断开的,以及
    3. 从stderr和stdout生成日志文件,其中的内容也将显示,但是
    4. 允许我停止查看正在进行的日志并在不中断运行过程的情况下执行其他操作

    享受。

    nohup java com.me.MyProgram </dev/null 2>&1 | tee logfile.log &
        4
  •  14
  •   S.Lott    15 年前

    我更喜欢 nohup 命令。博客上说有更好的方法,但我认为还不够好。

        5
  •  5
  •   John T    15 年前

    你可以试试 Java Service Wrapper ,社区版免费,满足您的需求。

        6
  •  4
  •   Don Branson marios    15 年前

    那要视情况而定。如果这只是一次性的事情,我希望对其进行后台监控,然后回家,但通常我会等待结果,我可能会这样做:

    nohup java com.me.MyProgram &
    

    在命令行。为了干净利落地杀死它,你有很多选择。您可能有一个sigkill侦听器,或者在端口上侦听并在建立连接时关闭,定期检查一个文件。不同的方法有不同的弱点。如果要在生产中使用,我会考虑更多,可能会在/etc/in it.d中添加一个脚本,使其不自动更新,并进行更复杂的关闭,如Tomcat所拥有的。

        7
  •  4
  •   colini    12 年前

    我在Ubuntu上的首选方法是使用libslack的“daemon”实用程序。这就是Jenkins在Ubuntu上使用的方法(这是我的想法所在),我在我的基于Jetty的服务器应用程序中使用了它,它工作得很好。

    当您停止守护进程时,它将向JVM发出关闭信号。此时可以通过向runtime.addShuthDownbook()注册一个shutdown hook来执行关闭/清除代码。

        8
  •  2
  •   Community dbr    7 年前

    This 问题是关于任意程序(不是Java特定)的后台化,所以一些答案可能适用于您的情况:

        9
  •  2
  •   Velu    8 年前

    daemontools:-在Unix上管理服务的更清洁的方法 https://cr.yp.to/daemontools.html

    1. 从URL安装守护程序工具 https://cr.yp.to/daemontools/install.html 请遵循此处提到的说明,如有任何问题,请尝试使用说明。 https://gist.github.com/rizkyabdilah/8516303

    2. 在以下位置创建文件 /etc/init/svscan.conf文件 并添加以下行。(仅适用于cent-os-6.7)

     start on runlevel [12345]
     stop on runlevel [^12345]
     respawn
     exec /command/svscanboot
    
    1. 创建名为的新脚本 运行 在/service/vm/文件夹中添加以下行。
    #!/bin/bash    
    echo starting VM 
    exec java -jar
    /root/learning-/daemon-java/vm.jar
    

    注: 用自己的JAR文件替换JAR。或任何Java类文件。

    1. 重新启动系统

    2. svstat/service/vm现在应该启动并运行!.

    3. svc-d/service/vm应该立即关闭vm!.
    4. svc-u/service/vm应该立即启动vm!.
        10
  •  0
  •   Oo.oO    7 年前

    请看这里:

    http://jnicookbook.owsiak.org/recipe-no-022/

    对于基于JNI的示例代码。在这种情况下,您可以将在Java中执行的代码和主循环在C.中执行,但也可以将主、守护进程、服务循环放在Java中。

    https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo029

    和JNI玩得开心!

        11
  •  0
  •   Zoe - Save the data dump 张群峰    6 年前
    nohup java -jar {{your-jar.jar}} > /dev/null &
    

    这可能会起作用。