Сбой сценария запуска Cassandra с параметром состояния

#cassandra

#кассандра

Вопрос:

База данных Cassandra работает нормально, но когда я выполняю /etc/init.d/cassandra status , она говорит cassandra is stopped . В сценарии я жестко запрограммировал местоположение pid так /var/run/cassandra/cassandra.pid , чтобы после выполнения скрипта в режиме отладки заметил, что скрипт использует неправильное расположение /var/run/cassandra.pid файла pid. Вот вывод ниже. Любая идея, где скрипт получает эту информацию о местоположении pid.

вывод отладки.

   . /etc/sysconfig/network
   NETWORKING_IPV6=no
   HOSTNAME=rvagcas01
   NETWORKING=yes
   NOZEROCONF=yes
  prog=Cassandra
  pidfile=/var/run/cassandra/cassandra.pid
  progbin=/db/cassandra/bin
  lock=/db/cassandra/cassandra.lock
  logfile=/db/cassandra/logs/service.log
  user=cassandra
  case "$1" in
  status cassandra
  local base pid lock_file= pid_file= binary=
  '[' 1 = 0 ']'
  '[' cassandra = -p ']'
  '[' cassandra = -l ']'
  '[' cassandra = -b ']'
  base=cassandra
  __pids_var_run cassandra '' ''
  local base=cassandra
  local pid_file=/var/run/cassandra.pid
   /usr/bin/dirname /var/run/cassandra.pid
  local pid_dir=/var/run
  local binary=
  '[' -d /var/run -a '!' -r /var/run ']'
  pid=
  '[' -f /var/run/cassandra.pid ']'
  return 3
  RC=3
  '[' -z '' -a -z '' ']'
   __pids_pidof cassandra
   pidof -c -m -o 25634 -o 23662 -o %PPID -x cassandra
   pidof -c -m -o 25634 -o 23662 -o %PPID -x cassandra
  pid=
  '[' -n '' ']'
  case "$RC" in
  '[' -z '' ']'
  lock_file=cassandra
  '[' -f /var/lock/subsys/cassandra ']'
  echo 'cassandra is stopped'
cassandra is stopped
  return 3
  exit 3
 

вот сценарий запуска.

     # cat /etc/init.d/cassandra
    #!/bin/bash
    # Cassandra database
    ### BEGIN INIT INFO
    # Provides:             cassandra
    # Required-Start:       $remote_fs $all
    # Required-Stop:
    # Default-Start:        2 3 4 5
    # Default-Stop:         0 1 6
    # Short-Description:    Apache Cassandra database server
    # Description:          Apache Cassandra database server
    ### END INIT INFO#
    # Author:
    #
    #
    # Description:  Cassandra Server.
    # Processname: cassandra
    # Config: /app/cassandra/conf/cassandra.yaml
    set -x

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

    # Source networking configuration.
    . /etc/sysconfig/network

    prog="Cassandra"
    pidfile="/var/run/cassandra/cassandra.pid"
    progbin="/app/cassandra/bin"
    lock="/app/cassandra/cassandra.lock"
    logfile="/app/cassandra/logs/service.log"
    user=cassandra

    WriteLog()
    {
        echo "`date`: $@" >> $logfile
    }

    LogInfo()
    {
        echo "$@"
        WriteLog "INFO: $@"
    }

    LogWarning()
    {
        echo "$@"
        WriteLog "WARNING: $@"
    }

    start()
    {
        if [ -f $pidfile ] amp;amp; checkpid `cat $pidfile`; then
            action "$prog is already running." /bin/false
            exit 0
        fi

        WriteLog "Starting $prog"

        daemon --user $user "$progbin/cassandra" -p $pidfile >> $logfile 2>amp;1
        usleep 500000
        RETVAL=$?
        if [ $RETVAL -eq 0 ]; then
            touch "$lock"
            action "Starting $prog" /bin/true
        else
            action "Starting $prog" /bin/false
        fi

        WriteLog "Started $prog"

        return $RETVAL
    }

    stop()
    {
        $progbin/nodetool -h localhost disablethrift
        $progbin/nodetool -h localhost disablegossip
        $progbin/nodetool -h localhost drain
        WriteLog "Stopping $prog"
        CASSIEPID=`cat "$pidfile"  2>/dev/null `
        if [ -n "$CASSIEPID" ]; then
            /bin/kill "$CASSIEPID" >/dev/null 2>amp;1
            ret=$?
            if [ $ret -eq 0 ]; then
                STOPTIMEOUT=60
                while [ $STOPTIMEOUT -gt 0 ]; do
                    /bin/kill -0 "$CASSIEPID" >/dev/null 2>amp;1 || break
                    sleep 1
                    let STOPTIMEOUT=${STOPTIMEOUT}-1
                done
                if [ $STOPTIMEOUT -eq 0 ]; then
                    echo "Timeout error occurred trying to stop $prog Daemon"
                    ret=1
                    action $"Stopping $prog: " /bin/false
                    LogInfo "Timeout error occurred trying to stop $prog Daemon pid($CASSIEPID)"
                else
                    rm -f "$lock"
                    action $"Stopping $prog: " /bin/true
                    WriteLog "INFO: $prog Daemon Stopped pid($CASSIEPID)"
                fi
            else
                action $"Stopping $prog: " /bin/false
                WriteLog "WARNING: $prog Daemon Stop Failed pid($CASSIEPID)"
            fi
        else
            ret=1
            action $"Stopping $prog: " /bin/false
        fi
        return $ret
    }

    restart()
    {
        LogInfo "Restart Initiated"
        stop
        start
    }

    ring()
    {
        $progbin/nodetool -h localhost ring
    }

    info()
    {
        $progbin/nodetool -h localhost info
    }

    netstats()
    {
        $progbin/nodetool -h localhost netstats
    }

    repair()
    {
        LogInfo "Starting Repair"
        $progbin/nodetool -h localhost repair
        LogInfo "Completed Repair"
    }

    cleanup()
    {
        LogInfo "Starting Cleanup"
        $progbin/nodetool -h localhost cleanup
        LogInfo "Completed Cleanup"
    }

    version()
    {
        $progbin/nodetool -h localhost version
    }

    # See how we were called.
    case "$1" in
      start)
        start
        ;;
      stop)
        stop
        ;;
      status)
        status cassandra
        ;;
      restart)
        restart
        ;;
      ring)
        ring
        ;;
      info)
        info
        ;;
      netstats)
        netstats
        ;;
      repair)
        repair
        ;;
      cleanup)
        cleanup
        ;;
      version)
        version
        ;;
      *)
        echo $"Usage: $0 {start|stop|status|restart|ring|info|netstats|repair|cleanup|version}"
        exit 1
    esac

    exit $?

#
 

Ответ №1:

У меня нет скрипта, который вы использовали для запуска / остановки / состояния.

Я предполагаю, что причина в __proc_pids в вашем отладочном выводе, в этом скрипте жестко указано местоположение.

/etc/init.d/функции

 # __proc_pids {program} [pidfile]
# Set $pid to pids from /var/run* for {program}.  $pid should be declared
# local in the caller.
# Returns LSB exit code for the 'status' action.
__pids_var_run() {
    local base=${1##*/}
    local pid_file=${2:-/var/run/$base.pid}
 

Вы можете сослаться на этот пример, я просматриваю его, кажется, может удовлетворить ваши требования.

https://gist.github.com/sgomezvillamor/5458309

Комментарии:

1. Спасибо за ответ. Я добавил сценарий запуска. Мне придется изменить status функцию.