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