Re[2]: Nginx не "умирает" корректно

Denis F. Latypoff denis at gostats.ru
Mon Apr 27 19:11:53 MSD 2009


Hello Gena,

Monday, April 27, 2009, 9:39:59 PM, you wrote:

> On Monday, April 27, 2009 at 13:54:09, Maxim Dounin wrote:

>>> >    restart() {
>>> >        configtest || return $?
>>> >        stop
>>> >        start
>>> >    }

> ...

MD>> Кроме того, старый процесс после окончания завершения удалит 
MD>> pid-файл, и это скорее всего уже будет pid-файл нового процесса.

> похоже что причина глюка в другом: новый nginx не будет запускаться
> командой "daemon $nginx -c $NGINX_CONF_FILE" если старый nginx не успел
> удалить свой pid-файл. [ функция daemon() из /etc/init.d/functions ]

> этот init-скрипт для nginx используется в CentOS, EPEL, Fedora.
> хотелось бы сделать какое-то нормальное решение а не ugly hack.

> будет ли нормальным решением проблемы добавить sleep 1 в функцию restart

> restart() {
>     configtest || return $?
>     stop
>     sleep 1
>     start
> }

> или можно придумать что-то лучшее? например, переименовывать
> старый pid-файл как можно скорее после получения сигнала
> из nginx.pid в nginx.pid.oldbin и потом не спеша удалять
> его в момент полного завершения работы старого мастера?

Как то так:

#/bin/sh

mode=$1
prefix=/usr/local/nginx
logdir=$prefix/logs
sbindir=$prefix/sbin
pid_file=$logdir/nginx.pid


lsb_functions="/lib/lsb/init-functions"
if test -f $lsb_functions ; then
  source $lsb_functions
else
  log_success_msg()
  {
    echo " SUCCESS! $@"
  }
  log_failure_msg()
  {
    echo " ERROR! $@"
  }
fi

wait_for_pid () {
  i=0
  while test $i -lt 35 ; do
    sleep 1
    case "$1" in
      'created')
        test -s $pid_file && i='' && break
        ;;
      'removed')
        test ! -s $pid_file && i='' && break
        ;;
      *)
        echo "wait_for_pid () usage: wait_for_pid created|removed"
        exit 1
        ;;
    esac
    echo $echo_n ".$echo_c"
    i=`expr $i + 1`
  done

  if test -z "$i" ; then
    log_success_msg
  else
    log_failure_msg
  fi
}


case "$mode" in
  'start')
    # Start daemon
    if test -s "$pid_file"
    then
      echo "nginx is already running"
    else
      echo $echo_n "Starting nginx"
      $sbindir/nginx
      wait_for_pid created
    fi
    ;;

  'stop')
    # Stop daemon. We use a signal here to avoid having to know the
    # root password.

    if test -s "$pid_file"
    then
      nginx_pid=`cat $pid_file`
      echo $echo_n "Shutting down nginx"
      kill -TERM $nginx_pid
      wait_for_pid removed
    else
      log_failure_msg "nginx PID file could not be found!"
    fi
    ;;

  'restart')
    # Stop the service and regardless of whether it was
    # running or not, start it again.
    $0 stop  $other_args
    $0 start $other_args
    ;;

  'reload')
    if test -s "$pid_file" ; then
      nginx_pid=`cat $pid_file`
      kill -HUP $nginx_pid && log_success_msg "Reloading nginx"
      touch $pid_file
    else
      log_failure_msg "nginx PID file could not be found!"
    fi
    ;;

  *)
    # usage
    echo "Usage: $0  {start|stop|restart|reload}"
    exit 1
    ;;
esac


-- 
Best regards,
 Denis                            mailto:denis at gostats.ru






More information about the nginx-ru mailing list