4

I'm installing Tomcat6 and using the following for /etc/init.d/tomcat6:

#!/bin/bash
# description: Tomcat6 service
# processname: java
# chkconfig: - 99 1
## Note: CATALINA_HOME and CATALINA_PID are set elsewhere.##

# Source function library.
. /etc/init.d/functions

# Source sysconfig for tomcat6 
if [ -f /etc/sysconfig/tomcat6 ]; then
  . /etc/sysconfig/tomcat6
fi

[ -d "$CATALINA_HOME" ] || { echo "Tomcat requires $CATALINA_HOME."; exit 1; }

case $1 in

  start|stop|run) 
    if su $TOMCAT_USER bash -c "cd $CATALINA_HOME/logs; $CATALINA_HOME/bin/catalina.sh $1"; then
      echo -n "Tomcat $1 successful"
      [ $1 == "stop" ] && rm -f $CATALINA_PID
    else
      echo -n "Error in Tomcat $1: $?"
    fi
    ;;

  restart)
    $0 start
    $0 stop
    ;;

  status)
    if [ -f "$CATALINA_PID" ]; then
      read kpid < "$CATALINA_PID"
      if ps --pid $kpid 2>&1 1>/dev/null; then
        echo "$0 is already running at ${kpid}"
      else
        echo "$CATALINA_PID found, but $kpid is not running"
      fi
      unset kpid
    else
      echo "$0 is stopped"
    fi
    ;;

esac   
exit 0

The problem, as noted in this related ticket, is that Chef checks the "status" of a service and will not start it if the "status" command returns an exit code of "0". Which it always does because the script itself completes successfully, regardless of whether the service is running or not.

I need to adapt my init script to return an exit code of 3 if the service is not running, per the guidelines for Init scripts posted here:

0   program is running or service is OK
1   program is dead and /var/run pid file exists
2   program is dead and /var/lock lock file exists
3   program is not running
4   program or service status is unknown
5-99    reserved for future LSB use
100-149 reserved for distribution use
150-199 reserved for application use
200-254 reserved

I modified my initial script to:

#!/bin/bash
# description: Tomcat6 service
# processname: java
# chkconfig: - 99 1

# Source function library.
. /etc/init.d/functions

# Source sysconfig for tomcat6 
if [ -f /etc/sysconfig/tomcat6 ]; then
  . /etc/sysconfig/tomcat6
fi

[ -d "$CATALINA_HOME" ] || { echo "Tomcat requires $CATALINA_HOME."; exit 1; }

exit_var=0 

case $1 in

  start|stop|run) 
    if su $TOMCAT_USER bash -c "cd $CATALINA_HOME/logs; $CATALINA_HOME/bin/catalina.sh $1"; then
      echo -n "Tomcat $1 successful"
      [ $1 == "stop" ] && rm -f $CATALINA_PID
    else
      echo -n "Error in Tomcat $1: $?"
      exit_var=1
    fi
    ;;

  restart)
    $0 start
    $0 stop
    ;;

  status)
    if [ -f "$CATALINA_PID" ]; then
      read kpid < "$CATALINA_PID"
      if ps --pid $kpid 2>&1 1>/dev/null; then
        echo "$0 is already running at ${kpid}"
        exit_var=0
      else
        echo "$CATALINA_PID found, but $kpid is not running"
        exit_var=4
      fi
      unset kpid
    else
      echo "$0 is stopped"
      exit_var=3  # Fixes issue with Chef not starting a stopped service.
    fi
    ;;

esac   
exit $exit_var

But those aren't ACTUALLY changing the exit codes for the script. How can I set different exit codes for different case scenarios?

Version Info:

  • OS: CentOS 6.5
  • Chef: 10.20
  • Tomcat: 6.0.39
Community
  • 1
  • 1
invict_us
  • 103
  • 3
  • 8

1 Answers1

3

You have the right idea, but you have exit_var=3 in the wrong place. I have placed it below to equal 3 for the status when it is already running:

status)
    if [ -f "$CATALINA_PID" ]; then
        read kpid < "$CATALINA_PID"
        if ps --pid $kpid 2>&1 1>/dev/null; then
            echo "$0 is already running at ${kpid}"
            ## Fixes issue with Chef not starting a stopped service.
            exit_var=3  ## this is the condition of already running
        else
            echo "$CATALINA_PID found, but $kpid is not running"
            exit_var=4
        fi
        unset kpid
    else
        echo "$0 is stopped"
        exit_var=5  # (renumbered 5 set as you desire)
    fi
    ;;

esac   
exit $exit_var
David C. Rankin
  • 81,885
  • 6
  • 58
  • 85