Start JBoss 7 as a service on Linux

后端 未结 12 1987
闹比i
闹比i 2020-12-12 11:54

Previous versions of JBoss included a scripts (like jboss_init_redhat.sh) that could be copied to /etc/init.d in order to add it as a service - so it would star

相关标签:
12条回答
  • 2020-12-12 12:33

    Another way to run JBoss as a service on linux:

    JBoss as service in linux

    0 讨论(0)
  • 2020-12-12 12:35

    I found no solution here which were really working... (at least for Ubuntu 12.04 LTS)

    So I made my own one (which is able to start JBoss & wait for it to complete, and stop it, using the start-stop-daemon utils) :

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

    One can change the JBOSS_CONF variable near the top of the file as well as removing it if the jboss-as.conf file is located at /etc/default/jboss-as-7.

    0 讨论(0)
  • 2020-12-12 12:39
    #! /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
    
    0 讨论(0)
  • 2020-12-12 12:44

    There is a directory in the jboss distribution located in bin/init.d with a shell script you can place in init.d to launch jboss as a service. The script is called jboss-as-standalone.sh

    0 讨论(0)
  • 2020-12-12 12:50

    Recently I wrote installer for JBoss AS 7 that downloads tar.gz file from RedHat's server, extract it, add jboss-as as service and makes some very basic configuration. With it I get ready for use JBoss AS 7 in several seconds.

    Installation script:

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

    Init script:

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

    I described the script steps in my blog post. It also has the link to download this script files as archive.

    0 讨论(0)
  • 2020-12-12 12:51

    I also took a shot at a script for Ubuntu 10.04 LTS. JBoss version is 7.1.1. I wanted a script that really tests for successful JBoss startup and that is able to shut down JBoss relatively gracefully. My starting point was the JBoss script included in the bin/init.d directory in the JBoss 7.1.1 download. I adapted this with some bits from other scripts on this page as well as other Ubuntu init scripts. Note that Ubuntu uses dash as its default init-script interpreter, not bash as apparently expected by the JBoss script. Of medium importance is that the logging takes place in /var/log/jboss-as instead of ${JBOSS_HOME}/standalone/log. The log is also used to determine if JBoss started up successfully.

    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
    

    And the accompanying configuration (put it in /etc/default/jboss-as ):

    # JBoss AS configuration
    JBOSS_HOME="/var/local/jboss-as"
    JBOSS_USER=jboss
    



    What works (commands, use sudo service jboss-as <command> after linking the script from /etc/init.d/jboss-as):

    • Startup (blocking until the server started successfully)
    • Stopping (also blocking)
    • Restart
    • Status

    What isn't tested:

    • If reloading works properly
    • What happens if JBoss fails
    • What happens for several other possible fails

    I didn't dive into several topics yet, especially:

    • What does set +e / set -e do exactly and is it required (it's used in other scripts)
    • What are the semantics of the log_*_msg functions and where should those be used
    • How to properly do the logging stuff (passing the location to JBoss)
    • If the jboss-cli.sh script could and should be used for more things (like startup/running detection)
    • If it's really necessary to have standalone.sh run as a process all the time
    • If the return values are appropriate

    Note that I'm definitely no shell script guru - I'm rather quite clueless. So if you find any stupidisms in the code or got any ideas for improvements, I'd be glad to hear them.

    0 讨论(0)
提交回复
热议问题