我已经使用 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 端口。