【问题标题】:Start JBoss 7 as a service on Linux在 Linux 上将 JBoss 7 作为服务启动
【发布时间】:2011-10-16 09:23:28
【问题描述】:

以前版本的 JBoss 包含一个脚本(如 jboss_init_redhat.sh),可以将其复制到 /etc/init.d 以便将其添加为服务 - 因此它会在启动时启动。我似乎在 JBoss 7 中找不到任何类似的脚本。有人已经做过类似的事情了吗?

附: 我正在尝试在 Ubuntu 10.04 中实现这一目标

【问题讨论】:

    标签: linux ubuntu ubuntu-10.04 jboss7.x start-stop-daemon


    【解决方案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://stackoverflow.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 &lt;command&gt;):

              • 启动(阻塞直到服务器成功启动)
              • 停止(也阻止)
              • 重启
              • 状态

              未测试的内容:

              • 如果重新加载工作正常
              • 如果 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 ] &amp;&amp; source /etc/profile.d/jboss.sh
              • @Andrey:你能提供一个jboss.shjava.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
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2016-07-17
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-07-01
                    • 2015-08-27
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多