当前位置: 首页 > 面试题库 >

如何使用jsvc将Java程序转换为守护程序?

段干博明
2023-03-14
问题内容

我编写了一个程序,现在希望将其转换为守护程序。由于我是菜鸟,对此一无所知,请您告诉我该怎么做,还是请给我一些基本的教程或相关阅读材料?我真的很想学习如何做?

谢谢你们


问题答案:

Java类:

package example;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import org.apache.commons.daemon.*;

class EchoTask extends TimerTask {
    @Override
    public void run() {
        System.out.println(new Date() + " running ...");
    }
}

public class Main implements Daemon {

    private static Timer timer = null;

    public static void main(String[] args) {
        timer = new Timer();
        timer.schedule(new EchoTask(), 0, 1000);
    }

    @Override
    public void init(DaemonContext dc) throws DaemonInitException, Exception {
        System.out.println("initializing ...");
    }

    @Override
    public void start() throws Exception {
        System.out.println("starting ...");
        main(null);
    }

    @Override
    public void stop() throws Exception {
        System.out.println("stopping ...");
        if (timer != null) {
            timer.cancel();
        }
    }

    @Override
    public void destroy() {
        System.out.println("done.");
    }

 }

Shell启动/停止脚本:

#!/bin/sh

# Setup variables
EXEC=/usr/bin/jsvc
JAVA_HOME=/usr/lib/jvm/java-6-sun
CLASS_PATH="/usr/share/java/commons-daemon.jar":"/path/to/your.jar"
CLASS=example.Main
USER=foo
PID=/tmp/example.pid
LOG_OUT=/tmp/example.out
LOG_ERR=/tmp/example.err

do_exec()
{
    $EXEC -home "$JAVA_HOME" -cp $CLASS_PATH -user $USER -outfile $LOG_OUT -errfile $LOG_ERR -pidfile $PID $1 $CLASS
}

case "$1" in
    start)
        do_exec
            ;;
    stop)
        do_exec "-stop"
            ;;
    restart)
        if [ -f "$PID" ]; then
            do_exec "-stop"
            do_exec
        else
            echo "service not running, will do nothing"
            exit 1
        fi
            ;;
    *)
            echo "usage: daemon {start|stop|restart}" >&2
            exit 3
            ;;
esac

效果:

$ ./service start && sleep 5 && ./service stop
$ cat /tmp/example.out
initializing ...
starting ...
Fri Oct 07 16:26:54 EEST 2011 running ...
Fri Oct 07 16:26:55 EEST 2011 running ...
Fri Oct 07 16:26:56 EEST 2011 running ...
Fri Oct 07 16:26:57 EEST 2011 running ...
Fri Oct 07 16:26:58 EEST 2011 running ...
stopping ...
done.


 类似资料:
  • 问题内容: 我正在Java 1.6中使用ExecutoreService,其启动方式仅由 当我的主线程完成时(以及线程池处理的所有任务),该池将阻止我的程序关闭,直到我显式调用 我是否可以通过以某种方式将此池使用的内部线程管理转换为守护线程来避免调用此方法?还是我在这里想念什么。 问题答案: Marco13的答案可能是最简单,首选的解决方案,因此不要被投票分歧(我的答案比以前大几岁)或验收标记所欺

  • 问题内容: 我正在做Java试卷,并且遇到了以下使我感到困惑的问题。 以下哪项是正确的?(选择所有适用项。) 答:当应用程序开始运行时,会有一个守护线程,其任务是执行main()。 B.当一个应用程序开始运行时,有一个非守护进程线程,其工作是执行main()。 C.由守护程序线程创建的线程最初也是守护程序线程。 D.由非守护程序线程创建的线程最初也是非守护程序线程。 关键答案是B,C,D,谁能告诉

  • 问题内容: 我试过了 返回: 并尝试: 当我回车期望过程继续运行时,我收到: 如何将sbt作为守护程序运行? 更新: 我认为cd上一个目录: 因此,它作为守护程序启动,但是如果我执行任何操作(如更改dir),它将终止该进程?如何保持进程运行? 问题答案: 看起来像从您的终端请求的输入。如果它确实不需要输入(可能是在后台运行程序),则可以这样运行: 编辑 好的,这是一个难题。简短答案:运行如下: 理

  • 问题内容: 我有一个使用Flask用Python编写的小应用程序。现在,我正在nohup下运行它,但是我想使其守护进程。这样做的正确方法是什么? 问题答案: 使用gunicorn部署可能是最简单的方法,请先安装gunicorn,然后: 尽管你可能想使用主管或类似性质的工具来监视黑胶皮(at the very least use – so you can reload/stop gunicorn e

  • 问题内容: 如何使Callable线程成为守护线程? 这是我正在尝试的。我正在尝试执行一组线程,其中一个线程未完成而进入无限循环。它执行的是程序的主线程不会终止,即使所有代码语句都已执行。之后主线程进入挂起模式。 这是相同的代码段。 主程序 问题答案: 如何使Callable线程成为守护线程? 您需要使用新的创建守护程序线程。在这里查看此答案:Java中的执行器和守护程序 默认情况下,执行者在构建

  • 问题内容: 在Ubuntu中将Go程序作为守护程序启动的正确方法是什么?然后,我将使用Monit对其进行监视。我应该做这样的事情吗: 我应该考虑Go特定的事情吗? 问题答案: 您应该为您的程序()构建可执行文件,然后为upstart编写脚本,它将为您的守护程序运行程序,或者使用诸如daemonize之类的外部工具。我更喜欢后一种解决方案,因为它不依赖于系统相关的新贵。通过守护进程,您可以像 这将为