首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Commons daemon / JSVC启动多个Java守护程序实例

使用Commons daemon / JSVC启动多个Java守护程序实例
EN

Stack Overflow用户
提问于 2014-01-31 16:07:18
回答 3查看 1.2K关注 0票数 1

我已经使用Commons Daemon / JSVC库对一个Java程序进行了守护进程,并且能够成功地启动/停止我的服务的一个实例。我真正需要做的是能够启动我的服务的多个实例,使用不同的命令参数启动和停止每个实例。

可能与这个问题无关,但有一点背景..我的服务包含一个绑定到特定端口的HTTP侦听器。每个实例将被初始化以侦听不同的端口。

我的问题是,我无法使用Commons Daemon提供的内置功能启动Java类的多个实例。也许我漏掉了什么。我是一名资深的Windows/C#开发人员,但对Java/Linux/Shell-scripting比较陌生。

用于启动JSVC进程和启动/停止我的守护进程的shell脚本如下所示。这是我在另一篇文章中在这个网站上发现的,只做了一些微小的修改。它传递我的守护进程所需的一些命令参数,我从指定这些参数的单独的启动和停止脚本调用此sh脚本。

代码语言:javascript
复制
#!/bin/sh

# Setup variables
EXEC=/usr/bin/jsvc
JAVA_HOME=/usr/lib/jvm/java-7-oracle
CLASS_PATH="/usr/share/java/commons-daemon-z.0.15.jar":"/opt/LuckyElephant/lib/LuckyElephant.jar"
CLASS=co.rightside.luckyelephant.Main
USER=ubuntu
PID=/tmp/luckyelephant.pid
LOG_OUT=/tmp/luckyelephant.out
LOG_ERR=/tmp/luckyelephant.err
ARGS="$*"

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

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: luckyelephant {start|stop|restart}" >&2
            exit 3
            ;;
esac

如果启动一个独特的Java类的多个实例在JSVC中是不可能的,那么还有什么替代方案呢?我需要一种安全稳定的方式来启动此服务的多个实例(我将使用SSH远程和编程地执行此操作),并且由于绑定到TCP端口,每个实例在完成时都需要正常关闭。

EN

回答 3

Stack Overflow用户

发布于 2014-01-31 16:16:49

你可以在最后用&运行你的java程序,让它在后台运行。

票数 0
EN

Stack Overflow用户

发布于 2014-03-10 02:29:41

假设需要部署此守护进程的n个实例,假设有3个实例(jDaemon_A、jDaemon_B和jDaemon_C)。我会使用以下3个选项之一来解决这个问题:

选项A:使用单独的数据目录部署服务3次。并使用命名约定来区分每种类型,例如

代码语言:javascript
复制
jDaemon_A using directory /root/jdA;
jDaemon_B using directory /root/jdB;
jDaemon_C using directory /root/jdC;

这样,您就可以启动每个单独项目

代码语言:javascript
复制
service jDaemon_A start
etc…

Java:实现上述内容,外加另一个类,它将在上述内容之上管理任意数量的实例,这样您就可以传递参数:

代码语言:javascript
复制
service jDaemon_Manager start all
service jDaemon_Manager start B

提供启动所有实例或仅启动一个特定实例的能力。

选项C:多线程。您是否考虑过让当前守护进程在多线程模式下只运行一个实例,以便在不同的线程上同时运行相同的逻辑?这样,您将只有一个守护进程在运行。

这可能是一个可行的解决方案,因为线程可能相对独立地工作。

当然,这可能不适用于您的情况,但我认为这是一条值得考虑的路线。

票数 0
EN

Stack Overflow用户

发布于 2015-03-05 15:01:42

我已经能够通过对每个实例使用不同的pidfile来运行一个守护程序的多个实例。还有不同的log_out和log_err文件,以便于跟踪。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21475163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档