在 Linux 上将 JBoss 7 作为服务启动
Posted
技术标签:
【中文标题】在 Linux 上将 JBoss 7 作为服务启动【英文标题】:Start JBoss 7 as a service on Linux 【发布时间】:2011-10-16 09:23:28 【问题描述】:以前版本的 JBoss 包含一个脚本(如 jboss_init_redhat.sh
),可以将其复制到 /etc/init.d 以便将其添加为服务 - 因此它会在启动时启动。我似乎在 JBoss 7 中找不到任何类似的脚本。有人已经做过类似的事情了吗?
附: 我正在尝试在 Ubuntu 10.04 中实现这一目标
【问题讨论】:
【参考方案1】:在 linux 上将 JBoss 作为服务运行的另一种方式:
JBoss as service in linux
【讨论】:
【参考方案2】:最近我为 JBoss AS 7 编写了安装程序,它从 RedHat 的服务器下载 tar.gz 文件,解压它,将 jboss-as 添加为服务并进行一些非常基本的配置。有了它,我可以在几秒钟内准备好使用 JBoss AS 7。
安装脚本:
#!/bin/bash
#title :jboss-install.sh
#description :The script to install JBoss AS 7.x
#author :Dmitriy Sukharev
#date :20130106
#usage :/bin/bash jboss-install.sh
JBOSS_AS_FILENAME=jboss-as-7.1.1.Final
JBOSS_AS_ARCHIVE_NAME=$JBOSS_AS_FILENAME.tar.gz
JBOSS_AS_DOWNLOAD_ADDRESS=http://download.jboss.org/jbossas/7.1/$JBOSS_AS_FILENAME/$JBOSS_AS_ARCHIVE_NAME
INSTALL_DIR=/opt
JBOSS_AS_FULL_DIR=$INSTALL_DIR/$JBOSS_AS_FILENAME
JBOSS_AS_DIR=$INSTALL_DIR/jboss-as
JBOSS_AS_USER="jboss-as"
JBOSS_AS_SERVICE="jboss-as"
JBOSS_AS_STARTUP_TIMEOUT=240
SCRIPT_DIR="$( cd "$( dirname "$BASH_SOURCE[0]" )" && pwd )"
echo "Cleaning up..."
rm "$JBOSS_AS_ARCHIVE_NAME"
rm "$JBOSS_AS_DIR"
rm -r "$JBOSS_AS_FULL_DIR"
rm -r "/var/run/$JBOSS_AS_SERVICE/"
rm /etc/init.d/$JBOSS_AS_SERVICE
echo "Installation..."
wget $JBOSS_AS_DOWNLOAD_ADDRESS
mkdir $JBOSS_AS_FULL_DIR
tar -xzf $JBOSS_AS_ARCHIVE_NAME -C $INSTALL_DIR
ln -s $JBOSS_AS_FULL_DIR/ $JBOSS_AS_DIR
useradd -s /sbin/nologin $JBOSS_AS_USER
chown -R $JBOSS_AS_USER:$JBOSS_AS_USER $JBOSS_AS_DIR
chown -R $JBOSS_AS_USER:$JBOSS_AS_USER $JBOSS_AS_DIR/
rm $JBOSS_AS_ARCHIVE_NAME
echo "Registrating JBoss as service..."
sed -e 's,$JBOSS_AS_USER,'$JBOSS_AS_USER',g; s,$JBOSS_AS_FILENAME,'$JBOSS_AS_FILENAME',g; s,$JBOSS_AS_SERVICE,'$JBOSS_AS_SERVICE',g; s,$JBOSS_AS_DIR,'$JBOSS_AS_DIR',g' $SCRIPT_DIR/jboss-as.template > /etc/init.d/$JBOSS_AS_SERVICE
chmod 755 /etc/init.d/$JBOSS_AS_SERVICE
echo "Configurating..."
sed -i -e 's,<deployment-scanner path="deployments" relative-to="jboss.server.base.dir" scan-interval="5000"/>,<deployment-scanner path="deployments" relative-to="jboss.server.base.dir" scan-interval="5000" deployment-timeout="'$JBOSS_AS_STARTUP_TIMEOUT'"/>,g' $JBOSS_AS_DIR/standalone/configuration/standalone.xml
sed -i -e 's,<virtual-server name="default-host" enable-welcome-root="true">,<virtual-server name="default-host" enable-welcome-root="false">,g' $JBOSS_AS_DIR/standalone/configuration/standalone.xml
sed -i -e 's,<inet-address value="$jboss.bind.address:127.0.0.1"/>,<any-address/>,g' $JBOSS_AS_DIR/standalone/configuration/standalone.xml
sed -i -e 's,<socket-binding name="ajp" port="8009"/>,<socket-binding name="ajp" port="28009"/>,g' $JBOSS_AS_DIR/standalone/configuration/standalone.xml
sed -i -e 's,<socket-binding name="http" port="8080"/>,<socket-binding name="http" port="28080"/>,g' $JBOSS_AS_DIR/standalone/configuration/standalone.xml
sed -i -e 's,<socket-binding name="https" port="8443"/>,<socket-binding name="https" port="28443"/>,g' $JBOSS_AS_DIR/standalone/configuration/standalone.xml
sed -i -e 's,<socket-binding name="osgi-http" interface="management" port="8090"/>,<socket-binding name="osgi-http" interface="management" port="28090"/>,g' $JBOSS_AS_DIR/standalone/configuration/standalone.xml
echo "Done."
初始化脚本:
#!/bin/sh
### BEGIN INIT INFO
# Provides: $JBOSS_AS_SERVICE
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start/Stop $JBOSS_AS_FILENAME
### END INIT INFO
JBOSS_USER=$JBOSS_AS_USER
JBOSS_DIR=$JBOSS_AS_DIR
case "$1" in
start)
echo "Starting $JBOSS_AS_FILENAME..."
start-stop-daemon --start --background --chuid $JBOSS_USER --exec $JBOSS_DIR/bin/standalone.sh
exit $?
;;
stop)
echo "Stopping $JBOSS_AS_FILENAME..."
start-stop-daemon --start --quiet --background --chuid $JBOSS_USER --exec $JBOSS_DIR/bin/jboss-cli.sh -- --connect command=:shutdown
exit $?
;;
log)
echo "Showing server.log..."
tail -500f $JBOSS_DIR/standalone/log/server.log
;;
*)
echo "Usage: /etc/init.d/jboss-as start|stop"
exit 1
;;
esac
exit 0
我在blog post 中描述了脚本步骤。它还具有将此脚本文件下载为存档的链接。
【讨论】:
【参考方案3】:要打印执行的命令的 PID,请使用 shell 变量 $!。此变量将打印执行进程的 PID。
case "$1" in
start)
echo "Starting JBoss AS 7.0.0"
su --session-command "$JBOSS_HOME/bin/standalone.sh >& /dev/null &" jboss
echo $! > /tmp/jboss.pid
;;
【讨论】:
【参考方案4】:我在这里没有找到真正有效的解决方案......(至少对于 Ubuntu 12.04 LTS)
所以我自己做了一个(它能够启动 JBoss 并等待它完成,然后使用 start-stop-daemon
工具停止它):
#!/bin/bash
#
# JBoss standalone control script
#
# Based on the file provided in JBoss AS 7.1.1 (https://github.com/jbossas/jboss-as/blob/master/build/src/main/resources/bin/init.d/jboss-as-standalone.sh)
# inspired by http://***.com/questions/6880902/start-jboss-7-as-a-service-on-linux and http://ptoconnor.wordpress.com/2012/11/19/jboss-as-7-1-1-on-an-ubuntu-12-04-aws-instance-running-oracle-java-7/
# Modified for Ubuntu Server 12.04 by Anthony O.
#
# chkconfig: - 80 20
# description: JBoss AS Standalone
# config: /etc/default/jboss-as-7
#
### BEGIN INIT INFO
# Provides: jboss-as
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Should-Start: $named
# Should-Stop: $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start JBoss AS
# Description: Start JBoss Application Server.
### END INIT INFO
#
JBOSS_CONF="/opt/jboss-as-7/bin/init.d/jboss-as.conf"
NAME=jboss-as-7
DEFAULT=/etc/default/$NAME
# Source function library.
. /lib/lsb/init-functions
# Load Java configuration.
# Ubuntu has it in /etc/default
[ -r /etc/default/java ] && . /etc/default/java
export JAVA_HOME
# Load JBoss AS init.d configuration.
if [ -z "$JBOSS_CONF" ]; then
JBOSS_CONF=$DEFAULT
fi
[ -r "$JBOSS_CONF" ] && . "$JBOSS_CONF"
# Set defaults.
if [ -z "$JBOSS_HOME" ]; then
JBOSS_HOME="/var/local/$NAME"
fi
export JBOSS_HOME
if [ -z "$JBOSS_USER" ]; then
JBOSS_USER="jboss"
fi
export JBOSS_USER
if [ -z "$JBOSS_PIDFILE" ]; then
JBOSS_PIDFILE=/var/run/$NAME/jboss-as-standalone.pid
fi
export JBOSS_PIDFILE
if [ -z "$JBOSS_CONSOLE_LOG" ]; then
JBOSS_CONSOLE_LOG=/var/log/$NAME/console.log
fi
# We need this to be set to get a pidfile !
if [ -z "$LAUNCH_JBOSS_IN_BACKGROUND" ]; then
LAUNCH_JBOSS_IN_BACKGROUND=true
fi
export LAUNCH_JBOSS_IN_BACKGROUND
if [ -z "$STARTUP_WAIT" ]; then
STARTUP_WAIT=120
fi
if [ -z "$SHUTDOWN_WAIT" ]; then
SHUTDOWN_WAIT=120
fi
if [ -z "$JBOSS_CONFIG" ]; then
JBOSS_CONFIG=standalone.xml
fi
JBOSS_SCRIPT=$JBOSS_HOME/bin/standalone.sh
MATCHING_ARGS=(--user "$JBOSS_USER" --pidfile "$JBOSS_PIDFILE")
start()
log_daemon_msg "Starting $NAME"
id $JBOSS_USER > /dev/null 2>&1
if [ $? -ne 0 -o -z "$JBOSS_USER" ]; then
log_failure_msg "User $JBOSS_USER does not exist..."
log_end_msg 1
exit 1
fi
mkdir -p $(dirname $JBOSS_CONSOLE_LOG)
cat /dev/null > $JBOSS_CONSOLE_LOG
chown $JBOSS_USER $JBOSS_CONSOLE_LOG
mkdir -p $(dirname $JBOSS_PIDFILE)
chown $JBOSS_USER: $(dirname $JBOSS_PIDFILE) || true
if [ ! -z "$JBOSS_USER" ]; then
start-stop-daemon --start $MATCHING_ARGS[@] --oknodo --chuid "$JBOSS_USER" --chdir "$JBOSS_HOME" --retry $STARTUP_WAIT $(if [ "$LAUNCH_JBOSS_IN_BACKGROUND" == "true" ] ; then echo "--background" ; fi) --startas /bin/bash -- -c "exec $JBOSS_SCRIPT -c $JBOSS_CONFIG 2>&1 > $JBOSS_CONSOLE_LOG"
else
log_failure_msg "Error: Environment variable JBOSS_USER not set or empty."
log_end_msg 1
exit 1
fi
if [ "$LAUNCH_JBOSS_IN_BACKGROUND" == "true" ] ; then
count=0
launched_status=1
until [ $count -gt $STARTUP_WAIT ]
do
grep 'JBAS015874:' $JBOSS_CONSOLE_LOG > /dev/null
if [ $? -eq 0 ] ; then
launched_status=0
break
fi
sleep 1
let count=$count+1;
done
log_end_msg $launched_status
return $launched_status
else
log_end_msg $?
return $?
fi
stop()
log_daemon_msg "Stopping $NAME"
END_STATUS=0
if [ -f $JBOSS_PIDFILE ]; then
start-stop-daemon --stop $MATCHING_ARGS[@] --retry $SHUTDOWN_WAIT
END_STATUS=$?
rm -f $JBOSS_PIDFILE
fi
log_end_msg $END_STATUS
return $END_STATUS
status()
start-stop-daemon --status --verbose $MATCHING_ARGS[@]
exit $?
reload()
log_begin_msg "Reloading $prog ..."
start-stop-daemon --start --quiet --chuid $JBOSS_USER --exec $JBOSS_HOME/bin/jboss-cli.sh -- --connect command=:reload
log_end_msg $?
exit $?
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
$0 stop
$0 start
;;
status)
status
;;
reload)
reload
;;
*)
## If no parameters are given, print which are avaiable.
echo "Usage: $0 start|stop|status|restart|reload"
exit 1
;;
esac
如果jboss-as.conf
文件位于/etc/default/jboss-as-7
,则可以更改文件顶部附近的JBOSS_CONF
变量以及将其删除。
【讨论】:
【参考方案5】:今晚刚刚经历了这一切,我想我会分享我的发现。 最后我按照这里的安装说明进行操作:http://ptoconnor.wordpress.com/2012/11/19/jboss-as-7-1-1-on-an-ubuntu-12-04-aws-instance-running-oracle-java-7/ 有一些改动;
我安装到 /usr/share 而不是 /opt
为了让 jboss 作为服务运行,我创建了一个指向 redhat/centos 友好的符号链接 /usr/share/jboss-as-7.1.1.Final/bin/init.d/jboss-as-standalone.sh 随 7.1.1 最终版本提供
sudo ln -s /usr/share/jboss-as-7.1.1.Final/bin/init.d/jboss-as-standalone.sh /etc/init.d/jboss
然后进行一些更改以使其对 ubuntu 友好
#!/bin/sh
#
# JBoss standalone control script
#
# chkconfig: - 80 20
# description: JBoss AS Standalone
# processname: standalone
# pidfile: /var/run/jboss-as/jboss-as-standalone.pid
# config: /etc/jboss-as/jboss-as.conf
# Source function library.
. /lib/lsb/init-functions
# Load Java configuration.
[ -r /etc/java/java.conf ] && . /etc/java/java.conf
export JAVA_HOME
# Load JBoss AS init.d configuration.
if [ -z "$JBOSS_CONF" ]; then
JBOSS_CONF="/etc/jboss-as/jboss-as.conf"
fi
[ -r "$JBOSS_CONF" ] && . "$JBOSS_CONF"
# Set defaults.
if [ -z "$JBOSS_HOME" ]; then
JBOSS_HOME=/usr/share/jboss-as
fi
export JBOSS_HOME
if [ -z "$JBOSS_PIDFILE" ]; then
JBOSS_PIDFILE=/var/run/jboss-as/jboss-as-standalone.pid
fi
export JBOSS_PIDFILE
if [ -z "$JBOSS_CONSOLE_LOG" ]; then
JBOSS_CONSOLE_LOG=/var/log/jboss-as/console.log
fi
if [ -z "$STARTUP_WAIT" ]; then
STARTUP_WAIT=30
fi
if [ -z "$SHUTDOWN_WAIT" ]; then
SHUTDOWN_WAIT=30
fi
if [ -z "$JBOSS_CONFIG" ]; then
JBOSS_CONFIG=standalone.xml
fi
JBOSS_SCRIPT=$JBOSS_HOME/bin/standalone.sh
prog='jboss-as'
CMD_PREFIX=''
JBOSS_USER=jboss
if [ ! -z "$JBOSS_USER" ]; then
if [ -x /lib/lsb/init-functions ]; then
CMD_PREFIX="start-stop-daemon -user $JBOSS_USER"
else
CMD_PREFIX="su - $JBOSS_USER -c"
fi
fi
start()
echo -n "Starting $prog: "
if [ -f $JBOSS_PIDFILE ]; then
read ppid < $JBOSS_PIDFILE;
if [ `ps --pid $ppid 2> /dev/null | grep -c $ppid 2> /dev/null` -eq '1' ]; then
echo -n "$prog is already running"
failure
echo
return 1
else
rm -f $JBOSS_PIDFILE
fi
fi
mkdir -p $(dirname $JBOSS_CONSOLE_LOG)
cat /dev/null > $JBOSS_CONSOLE_LOG
mkdir -p $(dirname $JBOSS_PIDFILE)
chown $JBOSS_USER $(dirname $JBOSS_PIDFILE) || true
#$CMD_PREFIX JBOSS_PIDFILE=$JBOSS_PIDFILE $JBOSS_SCRIPT 2>&1 > $JBOSS_CONSOLE_LOG &
#$CMD_PREFIX JBOSS_PIDFILE=$JBOSS_PIDFILE $JBOSS_SCRIPT &
if [ ! -z "$JBOSS_USER" ]; then
if [ -x /lib/lsb/init-functions ]; then
start-stop-daemon -user $JBOSS_USER LAUNCH_JBOSS_IN_BACKGROUND=1 JBOSS_PIDFILE=$JBOSS_PIDFILE $JBOSS_SCRIPT -c $JBOSS_CONFIG 2>&1 > $JBOSS_CONSOLE_LOG &
else
su - $JBOSS_USER -c "LAUNCH_JBOSS_IN_BACKGROUND=1 JBOSS_PIDFILE=$JBOSS_PIDFILE $JBOSS_SCRIPT -c $JBOSS_CONFIG" 2>&1 > $JBOSS_CONSOLE_LOG &
fi
fi
count=0
launched=false
until [ $count -gt $STARTUP_WAIT ]
do
grep 'JBoss AS.*started in' $JBOSS_CONSOLE_LOG > /dev/null
if [ $? -eq 0 ] ; then
launched=true
break
fi
sleep 1;
count=`expr $count + 1`
done
printf success
echo
return 0
stop()
echo -n "Stopping $prog: "
count=0;
if [ -f $JBOSS_PIDFILE ]; then
read kpid < $JBOSS_PIDFILE;
kwait=$SHUTDOWN_WAIT
# Try issuing SIGTERM
kill -15 $kpid
until [ `ps --pid $kpid 2> /dev/null | grep -c $kpid 2> /dev/null` -eq '0' ] || [ $count -gt $kwait ]
do
sleep 1;
count=`expr $count + 1`
done
if [ $count -gt $kwait ]; then
kill -9 $kpid
fi
fi
rm -f $JBOSS_PIDFILE
printf success
echo
status()
if [ -f $JBOSS_PIDFILE ]; then
read ppid < $JBOSS_PIDFILE
if [ `ps --pid $ppid 2> /dev/null | grep -c $ppid 2> /dev/null` -eq '1' ]; then
echo "$prog is running (pid $ppid)"
return 0
else
echo "$prog dead but pid file exists"
return 1
fi
fi
echo "$prog is not running"
return 3
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
$0 stop
$0 start
;;
status)
status
;;
*)
## If no parameters are given, print which are avaiable.
echo "Usage: $0 start|stop|status|restart|reload"
exit 1
;;
esac
现在只是使用上面的脚本安装 jboss 服务的一个例子。
sudo update-rc.d jboss defaults
我知道现在有很多变化,但希望这将有助于下一个人搜索。我想要的只是一个 JBPM 主机......
【讨论】:
【参考方案6】:我还为 Ubuntu 10.04 LTS 编写了一个脚本。 JBoss 版本是 7.1.1。我想要一个真正测试成功的 JBoss 启动并且能够相对优雅地关闭 JBoss 的脚本。我的出发点是 JBoss 7.1.1 下载的 bin/init.d 目录中包含的 JBoss 脚本。我使用此页面上的其他脚本以及其他 Ubuntu 初始化脚本中的一些内容对此进行了调整。请注意,Ubuntu 使用 dash 作为其默认的 init-script 解释器,而不是 JBoss 脚本显然期望的 bash。
中等重要性是日志记录发生在/var/log/jboss-as
而不是$JBOSS_HOME/standalone/log
。该日志还用于判断 JBoss 是否启动成功。
jboss-as-standalone.sh
#!/bin/sh
#
# JBoss standalone control script
#
# Provided in JBoss AS 7.1.1
# Modified for Ubuntu Server 10.04 by koma
#
# chkconfig: - 80 20
# description: JBoss AS Standalone
# processname: standalone
# pidfile: /var/run/jboss-as/jboss-as-standalone.pid
# config: /etc/default/jboss-as
#
### BEGIN INIT INFO
# Provides: jboss-as
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Should-Start: $named
# Should-Stop: $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start JBoss AS
# Description: Start JBoss Application Server.
### END INIT INFO
#
# Inspired by tomcat6 init script, might be somewhat redundant
#PATH=???
NAME=jboss-as
DESC="JBoss AS"
DEFAULT=/etc/default/$NAME
# Source function library.
#. /etc/init.d/functions
# Ubuntu has it here (but probably different !)
. /lib/lsb/init-functions
# Load Java configuration.
# Ubuntu has it in /etc/default
[ -r /etc/default/java ] && . /etc/default/java
export JAVA_HOME
# Load JBoss AS init.d configuration.
if [ -z "$JBOSS_CONF" ]; then
# Ubuntu: seems more logical there
JBOSS_CONF="/etc/default/jboss-as"
fi
[ -r "$JBOSS_CONF" ] && . "$JBOSS_CONF"
# Set defaults.
if [ -z "$JBOSS_HOME" ]; then
JBOSS_HOME="/var/local/jboss-as"
fi
export JBOSS_HOME
# might be unbeautiful
# this made chown fail because JBOSS_USER was empty
if [ -z "$JBOSS_USER" ]; then
JBOSS_USER="jboss"
fi
export JBOSS_USER
if [ -z "$JBOSS_PIDFILE" ]; then
JBOSS_PIDFILE=/var/run/jboss-as/jboss-as-standalone.pid
fi
export JBOSS_PIDFILE
#if [ -z "$JBOSS_CONSOLE_LOG" ]; then
# JBOSS_CONSOLE_LOG=/var/log/jboss-as/console.log
#fi
# use JBOSS_LOG_DIR from jboss script instead
if [ -z "$JBOSS_LOG_DIR" ]; then
JBOSS_LOG_DIR=/var/log/jboss-as
fi
export JBOSS_LOG_DIR
# We need this to be set to get a pidfile !
if [ -z "$LAUNCH_JBOSS_IN_BACKGROUND" ]; then
LAUNCH_JBOSS_IN_BACKGROUND=true
fi
export LAUNCH_JBOSS_IN_BACKGROUND
if [ -z "$STARTUP_WAIT" ]; then
STARTUP_WAIT=120
fi
if [ -z "$SHUTDOWN_WAIT" ]; then
SHUTDOWN_WAIT=120
fi
if [ -z "$JBOSS_CONFIG" ]; then
JBOSS_CONFIG=standalone.xml
fi
JBOSS_SCRIPT=$JBOSS_HOME/bin/standalone.sh
prog='jboss-as'
start()
log_daemon_msg "Starting $DESC"
id $JBOSS_USER > /dev/null 2>&1
if [ $? -ne 0 -o -z "$JBOSS_USER" ]; then
log_failure_msg "User $JBOSS_USER does not exist..."
log_end_msg 1
exit 1
fi
if [ -f $JBOSS_PIDFILE ]; then
read ppid < $JBOSS_PIDFILE
if [ `ps --pid $ppid 2> /dev/null | grep -c $ppid 2> /dev/null` -eq '1' ]; then
log_progress_msg "$prog is already running"
log_end_msg 0
exit 0
else
rm -f $JBOSS_PIDFILE
fi
fi
mkdir -p $JBOSS_LOG_DIR
# not sure: clear boot.log ... dunno if good, dunno if hardcoding boot.log good
cat /dev/null > $JBOSS_LOG_DIR"/boot.log"
# same as for boot.log, but we need to clear server.log to get proper launch detection (grepping later)
cat /dev/null > $JBOSS_LOG_DIR"/server.log"
chown -R $JBOSS_USER: $JBOSS_LOG_DIR
mkdir -p $(dirname $JBOSS_PIDFILE)
chown $JBOSS_USER: $(dirname $JBOSS_PIDFILE) || true
if [ ! -z "$JBOSS_USER" ]; then
start-stop-daemon --start -b -u "$JBOSS_USER" -c "$JBOSS_USER" -d "$JBOSS_HOME" -p "$JBOSS_PIDFILE" -x $JBOSS_HOME/"bin/standalone.sh" -- -Djboss.server.log.dir="$JBOSS_LOG_DIR"
else
log_failure_msg "Error: Environment variable JBOSS_USER not set or empty."
log_end_msg 1
exit 1
fi
count=0
launched=false
until [ $count -gt $STARTUP_WAIT ]
do
grep 'JBoss AS.*started in' $JBOSS_LOG_DIR"/server.log" > /dev/null
if [ $? -eq 0 ] ; then
launched=true
break
fi
sleep 1
count=$((count+1));
done
if [ $launched=true ]; then
if [ -f $JBOSS_PIDFILE ] && [ -s $JBOSS_PIDFILE ]; then
log_progress_msg "Successfully started $DESC."
else
log_progress_msg "Successfully started $DESC, but problems with pidfile."
fi
else
log_failure_msg "Launching $DESC failed."
# If the pidfile exists, try to kill the process
if [ -f $JBOSS_PIDFILE ] && [ -s $JBOSS_PIDFILE ]; then
read kpid < $JBOSS_PIDFILE
log_progress_msg "Pidfile detected. Please take care of process $kpid manually."
fi
log_end_msg 1
exit 1
fi
# success
log_end_msg 0
return 0
stop()
log_daemon_msg "Stopping $DESC"
count=0;
if [ -f $JBOSS_PIDFILE ]; then
read kpid < $JBOSS_PIDFILE
kwait=$SHUTDOWN_WAIT
# Try issuing SIGTERM
kill -15 $kpid
until [ `ps --pid $kpid 2> /dev/null | grep -c $kpid 2> /dev/null` -eq '0' ] || [ $count -gt $kwait ]
do
sleep 1
count=$((count+1));
done
if [ $count -gt $kwait ]; then
kill -9 $kpid
fi
fi
rm -f $JBOSS_PIDFILE
log_end_msg 0
return 0
status()
if [ -f $JBOSS_PIDFILE ]; then
read ppid < $JBOSS_PIDFILE
if [ `ps --pid $ppid 2> /dev/null | grep -c $ppid 2> /dev/null` -eq '1' ]; then
log_success_msg "$prog is running (pid $ppid)"
exit 0
else
log_success_msg "$prog dead but pid file exists"
exit 1
fi
fi
log_success_msg "$prog is not running"
exit 3
reload()
log_begin_msg "Reloading $prog ..."
start-stop-daemon --start --quiet --background --chuid jboss --exec $JBOSS_HOME/bin/jboss-cli.sh -- --connect command=:reload
log_end_msg $?
exit $?
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
$0 stop
$0 start
;;
status)
status
;;
reload)
reload
;;
*)
## If no parameters are given, print which are avaiable.
echo "Usage: $0 start|stop|status|restart|reload"
exit 1
;;
esac
以及随附的配置(放在 /etc/default/jboss-as 中):
# JBoss AS configuration
JBOSS_HOME="/var/local/jboss-as"
JBOSS_USER=jboss
什么有效(命令,从/etc/init.d/jboss-as
链接脚本后使用sudo service jboss-as <command>
):
未测试的内容:
如果重新加载工作正常 如果 JBoss 失败会发生什么 其他几种可能的失败会发生什么情况我还没有深入研究几个主题,尤其是:
set +e / set -e 到底是做什么的,是否需要(在其他脚本中使用) log__*_msg 函数的语义是什么,应该在哪里使用这些函数 如何正确进行日志记录(将位置传递给 JBoss) 如果 jboss-cli.sh 脚本可以而且应该用于更多的事情(比如启动/运行检测) 如果真的有必要让standalone.sh 一直作为进程运行 如果返回值合适请注意,我绝对不是 shell 脚本专家——我相当无知。因此,如果您在代码中发现任何愚蠢之处或有任何改进的想法,我会很高兴听到它们。
【讨论】:
在 Ubuntu 12.10 上,log_progress_msg
在控制台上没有输出。这会导致脚本没有出现问题(在我的例子中是 pid 文件)。将其更改为log_action_msg
,它将提供更多输出
为了创建 pid 文件,在启动守护程序服务时需要选项 --make-pidfile
: start-stop-daemon --start -b -u "$JBOSS_USER" -c "$JBOSS_USER " -d "$JBOSS_HOME" -p "$JBOSS_PIDFILE" --make-pidfile -x $JBOSS_HOME/"bin/standalone.sh" -- -Djboss.server.log.dir="$JBOSS_LOG_DIR"
"set +e / set -e 究竟做了什么,是否需要(在其他脚本中使用)" 这将脚本执行设置为“出错时退出”模式(因此脚本不是t 不断检查命令返回码)。您希望保留“-e”,以便捕获启动错误而不是静默忽略。【参考方案7】:
在 jboss 发行版中有一个位于 bin/init.d 的目录,其中包含一个 shell 脚本,您可以将其放在 init.d 中以将 jboss 作为服务启动。该脚本名为 jboss-as-standalone.sh
【讨论】:
它在 Ubuntu 上不能很好地工作。启动脚本非常依赖于发行版。 那些脚本不兼容 Ubuntu(至少 12.04)【参考方案8】:经过几个小时的窥探,我最终创建了/etc/init.d/jboss
,内容如下
#!/bin/sh
### BEGIN INIT INFO
# Provides: jboss
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start/Stop JBoss AS v7.0.0
### END INIT INFO
#
#source some script files in order to set and export environmental variables
#as well as add the appropriate executables to $PATH
[ -r /etc/profile.d/java.sh ] && . /etc/profile.d/java.sh
[ -r /etc/profile.d/jboss.sh ] && . /etc/profile.d/jboss.sh
case "$1" in
start)
echo "Starting JBoss AS 7.0.0"
#original:
#sudo -u jboss sh $JBOSS_HOME/bin/standalone.sh
#updated:
start-stop-daemon --start --quiet --background --chuid jboss --exec $JBOSS_HOME/bin/standalone.sh
;;
stop)
echo "Stopping JBoss AS 7.0.0"
#original:
#sudo -u jboss sh $JBOSS_HOME/bin/jboss-admin.sh --connect command=:shutdown
#updated:
start-stop-daemon --start --quiet --background --chuid jboss --exec $JBOSS_HOME/bin/jboss-admin.sh -- --connect command=:shutdown
;;
*)
echo "Usage: /etc/init.d/jboss start|stop"
exit 1
;;
esac
exit 0
这是java.sh
的内容:
export JAVA_HOME=/usr/lib/jvm/java_current
export PATH=$JAVA_HOME/bin:$PATH
还有jboss.sh
:
export JBOSS_HOME=/opt/jboss/as/jboss_current
export PATH=$JBOSS_HOME/bin:$PATH
显然,您需要确保将 JAVA_HOME 和 JBOSS_HOME 设置为适合您的环境。
然后我运行 sudo update-rc.d jboss defaults
以便 JBoss 在系统启动时自动启动
我发现this article 有助于创建上面的启动脚本。同样,上面的脚本适用于 Ubuntu(在我的例子中是 10.04 版),因此在 Fedora/RedHat 或 CentOS 中使用它可能无法正常工作(在 cmets 中完成的设置与这些不同)。
【讨论】:
另请参阅chkconfig、--add
选项。
可以使用这样的构造导入jboss.sh
文件:[ -r /etc/profile.d/jboss.sh ] && source /etc/profile.d/jboss.sh
@Andrey:你能提供一个jboss.sh
和java.sh
的例子吗?那么您的解决方案将是完整的,没有人会怀疑他是否遗漏了这些文件中的某些内容。
@Thor:没问题,我更新了我的答案。我还计划更新使用 start-stop-daemon 的说明(因为这是启动/停止服务的正确方法)
在 JBoss AS 7.1.1 jboss-admin.sh 脚本不存在。相反,您可以使用 jboss-cli.sh【参考方案9】:
这是我给 gentoo 的。还不完美,但很干净,对我来说工作得很好。第一个对 jboss 安装的小改动:
~ # JBOSS_HOME=/opt/jboss # or whatever you have it as
~ # echo "LAUNCH_JBOSS_IN_BACKGROUND=true" >> "$JBOSS_HOME"/bin/standalone.conf
.
~ # cat /etc/conf.d/jboss
JBOSS_HOME=/opt/jboss
JBOSS_USER=jboss
JBOSS_PIDFILE=/var/run/jboss/jboss.pid
JBOSS_EXECUTABLE="$JBOSS_HOME"/bin/standalone.sh
JBOSS_STDOUT_LOG=/var/log/jboss/stdout.log
JBOSS_STDERR_LOG=/var/log/jboss/stderr.log
JBOSS_SHUTDOWN_WAIT_SECONDS=60
.
~ # cat /etc/init.d/jboss
#!/sbin/runscript
depend()
need net
start()
ebegin "Starting JBoss"
start-stop-daemon -S -b -m -p "$JBOSS_PIDFILE" -u "$JBOSS_USER" -x "$JBOSS_EXECUTABLE" -1 "$JBOSS_STDOUT_LOG" -2 "$JBOSS_STDERR_LOG"
eend $?
stop()
ebegin "Stopping JBoss"
start-stop-daemon -K -p "$JBOSS_PIDFILE" -u "$JBOSS_USER" -R $JBOSS_SHUTDOWN_WAIT_SECONDS
eend $?
部署全部完成后,我无法让启动说 [ OK ]。我已经尝试了一些东西,但还没有运气——它要么永远等待,要么目前只是在 shell 脚本分叉后说 [ OK ]。停止更好,只要您将延迟设置得足够长。日志轮换很容易添加
【讨论】:
【参考方案10】:此处标记为正确的答案对我不起作用。重新启动时,您会收到与使用 sudo 相关的安全错误,指出“抱歉,您必须有一个 tty 才能运行 sudo。”进一步的研究表明,禁用 sudo tty 限制可能会导致密码的纯文本暴露,所以这是不好的。
这是我最终得到的,它对我来说很好用:
#!/bin/sh
### BEGIN INIT INFO
# Provides: jboss
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start/Stop JBoss AS v7.0.0
### END INIT INFO
#
#source some script files in order to set and export environmental variables
#as well as add the appropriate executables to $PATH
[ -r /etc/profile.d/java.sh ] && . /etc/profile.d/java.sh
[ -r /etc/profile.d/jboss.sh ] && . /etc/profile.d/jboss.sh
case "$1" in
start)
echo "Starting JBoss AS 7.0.0"
su --session-command "$JBOSS_HOME/bin/standalone.sh >& /dev/null &" jboss
;;
stop)
echo "Stopping JBoss AS 7.0.0"
su --session-command "$JBOSS_HOME/bin/jboss-admin.sh --connect command=:shutdown" jboss
;;
*)
echo "Usage: /etc/init.d/jboss start|stop"
exit 1
;;
esac
exit 0
【讨论】:
【参考方案11】:在bin目录下观察你有init.d/jboss-as-standalone.sh (jboss-as-7.1.0.CR1b)
【讨论】:
那些脚本不兼容 Ubuntu(至少 12.04) Anthony O. 用户正试图在 Ubuntu 10.04 而不是 12.04 中运行脚本,我无法写出对所有未来发行版都有效的答案 :) 所以不要对我投反对票,但是 jboss 团队 【参考方案12】:#! /bin/sh
start()
echo "Starting JBoss 7"
sudo -u jboss sh /usr/local/jboss/bin/standalone.sh
stop()
echo "Stopping JBoss 7"
sudo -u jboss sh /usr/local/jboss/bin/jboss-admin.sh --connect command=:shutdown
restart()
stop
# give stuff some time to stop before we restart
sleep 60
# protect against any services that can't stop before we restart
su -l jboss -c 'killall java'
start
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo "Usage: jboss start|stop|restart"
exit 1
;;
esac
exit 0
【讨论】:
以上是关于在 Linux 上将 JBoss 7 作为服务启动的主要内容,如果未能解决你的问题,请参考以下文章
在 DHCP 服务器 Linux 上启动 Jboss EAP 和 UnknownHostException