我已经使用Commons Daemon / JSVC库对一个Java程序进行了守护进程,并且能够成功地启动/停止我的服务的一个实例。我真正需要做的是能够启动我的服务的多个实例,使用不同的命令参数启动和停止每个实例。
可能与这个问题无关,但有一点背景..我的服务包含一个绑定到特定端口的HTTP侦听器。每个实例将被初始化以侦听不同的端口。
我的问题是,我无法使用Commons Daemon提供的内置功能启动Java类的多个实例。也许我漏掉了什么。我是一名资深的Windows/C#开发人员,但对Java/Linux/Shell-scripting比较陌生。
用于启动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如果启动一个独特的Java类的多个实例在JSVC中是不可能的,那么还有什么替代方案呢?我需要一种安全稳定的方式来启动此服务的多个实例(我将使用SSH远程和编程地执行此操作),并且由于绑定到TCP端口,每个实例在完成时都需要正常关闭。
发布于 2014-01-31 16:16:49
你可以在最后用&运行你的java程序,让它在后台运行。
发布于 2014-03-10 02:29:41
假设需要部署此守护进程的n个实例,假设有3个实例(jDaemon_A、jDaemon_B和jDaemon_C)。我会使用以下3个选项之一来解决这个问题:
选项A:使用单独的数据目录部署服务3次。并使用命名约定来区分每种类型,例如
jDaemon_A using directory /root/jdA;
jDaemon_B using directory /root/jdB;
jDaemon_C using directory /root/jdC;这样,您就可以启动每个单独项目
service jDaemon_A start
etc…Java:实现上述内容,外加另一个类,它将在上述内容之上管理任意数量的实例,这样您就可以传递参数:
service jDaemon_Manager start all
service jDaemon_Manager start B提供启动所有实例或仅启动一个特定实例的能力。
选项C:多线程。您是否考虑过让当前守护进程在多线程模式下只运行一个实例,以便在不同的线程上同时运行相同的逻辑?这样,您将只有一个守护进程在运行。
这可能是一个可行的解决方案,因为线程可能相对独立地工作。
当然,这可能不适用于您的情况,但我认为这是一条值得考虑的路线。
发布于 2015-03-05 15:01:42
我已经能够通过对每个实例使用不同的pidfile来运行一个守护程序的多个实例。还有不同的log_out和log_err文件,以便于跟踪。
https://stackoverflow.com/questions/21475163
复制相似问题