1

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

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

我的问题是我无法使用 Commons Daemon 提供的内置功能启动我的 Java 类的多个实例。也许我错过了一些东西。我是一名长期的 Windows/C# 开发人员,但对 Java/Linux/Shell 脚本编写相对较新。

下面是启动 JSVC 进程和启动/停止我的守护进程的 shell 脚本。这是我在本网站的另一篇文章中找到的,稍作修改。它通过我的守护程序需要的一些命令参数,我从指定这些参数的单独启动和停止脚本调用这个 sh 脚本。

#!/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

如果在 JSVC 中无法启动多个唯一 Java 类的实例,还有什么替代方法?我需要一种安全稳定的方式来启动该服务的多个实例(我将使用 SSH 以远程和编程方式执行此操作),并且每个实例都需要在完成后正常关闭,因为它们绑定到 TCP 端口。

4

3 回答 3

0

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

于 2015-03-05T07:01:41.547 回答
0

Assuming n instances of this daemon need to be deployed, let's say 3 (jDaemon_A, jDaemon_B & jDaemon_C). I would approach the problem using one of the following 3 options:

Option A: Have the service deployed 3 times each using a separate data directory. And use a naming convention to differentiate between each e.g.

jDaemon_A using directory /root/jdA;
jDaemon_B using directory /root/jdB;
jDaemon_C using directory /root/jdC;

such that you can start each individual one

service jDaemon_A start
etc…

Option B: Implement the above, plus another Java class which will manage as many instances as you like on top of the above such that you can have arguments passed:

service jDaemon_Manager start all
service jDaemon_Manager start B

Providing the ability to start all or just 1 particular instance only.

Option C: Multi-threading. Have you considered having the current daemon running just 1 instance with in multithreaded-mode such that the same logic is run simultaneously on separate threads? This way you would only have one daemon running.

This could be a viable solution since threads may work relatively independently.

Of course this might not be applicable in your case but thought it’s a route worth considering.

于 2014-03-09T18:29:41.183 回答
0

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

于 2014-01-31T08:16:48.983 回答