Как доработать init-скрипт, чтобы он не задваивал процессы?

Добрый день.

Есть один init-скрипт, он работает нормально, но если запустить restart, то процесс задваивается - restart еще раз - затраивается, и так запускается множество процессов, которые можно убить только с помощью kill по pid.

Я пока удалил из скрипта restart, но может каким-то образом его можно починить?

Вот сам скрипт:

#!/bin/bash
#
# tomcat
#
# chkconfig: 345 96 30
# description:  Start up the Tomcat servlet engine.
#
# processname: java
# pidfile: /var/run/tomcat.pid
#
### BEGIN INIT INFO
# Provides: tomcat
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Should-Start: distcache
# Short-Description: start and stop Apache HTTP Server
# Description: implementation for Servlet 2.5 and JSP 2.1
## END INIT INFO

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

## tomcat installation directory
PROCESS_NAME=tomcat

CATALINA_HOME="/tomcat"

## run as a diffent user
TOMCAT_USER=tomcat

##  Path to the pid, runnning info file
pidfile=${PIDFILE-/var/run/${PROCESS_NAME}.pid};
lockfile=${LOCKFILE-/var/lock/subsys/${PROCESS_NAME}};

RETVAL=0

case "$1" in
 start)
        PID=`pidofproc -p ${pidfile} ${PROCESS_NAME}`
        if [[ (-n ${PID}) && ($PID -gt 0) ]]; then
                logger -s "${PROCESS_NAME}(pid ${PID}) is  already running."
                exit;
        fi
        if [ -f $CATALINA_HOME/bin/startup.sh ];
          then
            logger -s "Starting Tomcat"
            /bin/su -l ${TOMCAT_USER} -c "$CATALINA_HOME/bin/startup.sh -Dprocessname=${PROCESS_NAME}"
            PID=`ps -eaf|grep processname=${PROCESS_NAME}|grep -v grep|awk '{print $2}'`
            RETVAL=$?
            [ $RETVAL = 0 ] && touch ${lockfile}
            [ $RETVAL = 0 ] && echo "${PID}" > ${pidfile}
        fi
        ;;
 stop)
        PID=`pidofproc -p ${pidfile} ${PROCESS_NAME}`
        ## if PID valid run shutdown.sh
        if [[ -z ${PID} ]];then
            logger -s "${PROCESS_NAME} is not running."
            exit;
        fi

        if [[ (${PID} -gt 0) && (-f $CATALINA_HOME/bin/shutdown.sh) ]];
          then
            logger -s "Stopping Tomcat"
            /bin/su -l ${TOMCAT_USER} -c "$CATALINA_HOME/bin/shutdown.sh"
            RETVAL=$?
            [ $RETVAL = 0 ] && rm -f ${lockfile}
            [ $RETVAL = 0 ] && rm -f ${pidfile}
        fi
        ;;
 status)
        status -p ${pidfile} ${PROCESS_NAME}
        RETVAL=$?
        ;;
 restart)
         $0 stop
         $0 start
         ;;
version)
        if [ -f $CATALINA_HOME/bin/version.sh ];
          then
            logger -s "Display Tomcat Version"
            /bin/su -l ${TOMCAT_USER} -c "$CATALINA_HOME/bin/version.sh"
            RETVAL=$?
        fi
        ;;
 *)
         echo $"Usage: $0 {start|stop|restart|status|version}"
        exit 1
        ;;
esac
exit $RETVAL
  • Вопрос задан
  • 174 просмотра
Решения вопроса 1
mikalaikaia
@mikalaikaia Автор вопроса
Переделал скрипт так, теперь он все останавливает и запускает как надо, не задваивая процессы. Таймаут в 20 секунд нужен потому, что приложение (.war) достаточно тяжелое, и Tomcat'у нужно время для того, чтобы завершиться корректно.

#!/bin/bash
#
# tomcat
#
# chkconfig: 345 96 30
# description:  Start up the Tomcat servlet engine.
#
# processname: java
# pidfile: /var/run/tomcat.pid
#
### BEGIN INIT INFO
# Provides: tomcat
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Should-Start: distcache
# Short-Description: start and stop Apache HTTP Server
# Description: implementation for Servlet 2.5 and JSP 2.1
## END INIT INFO

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

## tomcat installation directory
PROCESS_NAME=tomcat

CATALINA_HOME="/tomcat"

## run as a diffent user
TOMCAT_USER=tomcat

##  Path to the pid, runnning info file
pidfile=${PIDFILE-/var/run/${PROCESS_NAME}.pid};
lockfile=${LOCKFILE-/var/lock/subsys/${PROCESS_NAME}};

RETVAL=0

SHUTDOWN_WAIT=20

case "$1" in
  start)
    PID=`pidofproc -p ${pidfile} ${PROCESS_NAME}`
    if [[ (-n ${PID}) && ($PID -gt 0) ]]; then
      logger -s "${PROCESS_NAME} (pid ${PID}) is already running."
      exit;
    fi
    if [ -f $CATALINA_HOME/bin/startup.sh ];
    then
      logger -s "Starting Tomcat"
      /bin/su -l ${TOMCAT_USER} -c "$CATALINA_HOME/bin/startup.sh -Dprocessname=${PROCESS_NAME}"
      PID=`ps -eaf|grep processname=${PROCESS_NAME}|grep -v grep|awk '{print $2}'`
      RETVAL=$?
      [ $RETVAL = 0 ] && touch ${lockfile}
      [ $RETVAL = 0 ] && echo "${PID}" > ${pidfile}
    fi
  ;;
  stop)
    PID=`pidofproc -p ${pidfile} ${PROCESS_NAME}`
    ## if PID valid run shutdown.sh
    if [[ -z ${PID} ]];then
      logger -s "${PROCESS_NAME} is not running."
      exit;
    fi
    
    if [[ (${PID} -gt 0) && (-f $CATALINA_HOME/bin/shutdown.sh) ]];
    then
      logger -s "Stopping Tomcat"
      /bin/su -l ${TOMCAT_USER} -c "$CATALINA_HOME/bin/shutdown.sh"
      RETVAL=$?
      [ $RETVAL = 0 ] && rm -f ${lockfile}
      [ $RETVAL = 0 ] && rm -f ${pidfile}
      
      let kwait=$SHUTDOWN_WAIT
      count=0;
      until [ `ps -p $PID | grep -c $PID` = '0' ] || [ $count -gt $kwait ]
      do
        logger -s "Waiting for processes ${PROCESS_NAME} (pid ${PID}) to exit.";
        sleep 1
        let count=$count+1;
      done
    fi
    
    if [ $count -gt $kwait ]; then
      logger -s "killing processes ${PROCESS_NAME} (pid ${PID}) didn't stop after $SHUTDOWN_WAIT seconds"
      logger -s "Terminating ${PROCESS_NAME} (pid ${PID})"
      kill -9 $PID
    fi
  ;;
  status)
    status -p ${pidfile} ${PROCESS_NAME}
    RETVAL=$?
  ;;
  restart)
    $0 stop
    $0 start
  ;;
  version)
    if [ -f $CATALINA_HOME/bin/version.sh ];
    then
      logger -s "Display Tomcat Version"
      /bin/su -l ${TOMCAT_USER} -c "$CATALINA_HOME/bin/version.sh"
      RETVAL=$?
    fi
  ;;
  *)
    echo $"Usage: $0 {start|stop|restart|status|version}"
    exit 1
  ;;
esac
exit $RETVAL
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
sim3x
@sim3x
Судя по манам

SYNOPSIS

       checkproc  [-v]  [-L]  [-k]  [-p  pid_file] [-c root] [-z]
       /full/path/to/executable

       checkproc [-v] [-k] [-n] name_of_kernel_thread

       pidofproc [-k] basename_of_executable


DESCRIPTION

       checkproc checks for running processes that use the speci­
       fied executable.


тебе нужен checkproc и /full/path/to/executable или `which ${PROCESS_NAME}`

Также можно просто сделать
killall -15 ${PROCESS_NAME}
sleep 1
pgrep ${PROCESS_NAME} && { echo "what a pain"; killall -9 ${PROCESS_NAME} }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы