Apache2 и mod_perl
nikky 13 марта, 2014 - 05:31
После установки mod_perl, apache стал выдавать сообщение "ERROR: apache2 failed to stop" при остановке. Сами скрипты и apache работают нормально.
»
- Для комментирования войдите или зарегистрируйтесь
.
Журналы читать не пробовал?
Говорят, помогает. Но иногда и не всем…
:wq
--
Live free or die
Сразу. В
Сразу. В /var/log/apache/error_log только "[notice] caught SIGTERM, shutting down". В /var/log/messages "ERROR: apache2 failed to stop".
.
Только не говори, что сообщение идентично на всех [задаваемых в конфиге Индейца] уровнях.
:wq
--
Live free or die
Молчу. Интересная мысль.
Молчу. Интересная мысль. Посмотрю.
На уровне debug добавляется
На уровне debug добавляется строка "[info] removed PID file /var/run/apache2.pid (pid=8326)". В остальном ничего примечательного.
Мне интересно это у всех так или только у меня. И главное почему. Вот мои настройки для mod_perl в /etc/apache2/modules.d/75_mod_perl.conf:
LoadModule perl_module modules/mod_perl.so
PerlRequire "/etc/apache2/modules.d/apache2-mod_perl-startup.pl"
PerlModule ModPerl::Registry
Больше ничего не меняю.
Кстати, команда "/usr/sbin/apache2 -D DEFAULT_VHOST -D INFO -D SSL -D SSL_DEFAULT_VHOST -D LANGUAGE -D USERDIR -D PHP5 -D PERL -D PYTHON -k stop" проходит успешно, останавливая apache.
Есть подозрение, что просто не хватает TIMEOUT для завершения модуля, который определен в /etc/init.d/apache2 TIMEOUT=${TIMEOUT:-15}.
Точнее ошибку выдает вот эта часть в /etc/init.d/apache2:
local i=0 retval=0
while ( test -f "${PIDFILE}" && pgrep -P ${PID} apache2 >/dev/null ) \
&& [ $i -lt ${TIMEOUT} ]; do
sleep 1 && i=$(expr $i + 1)
done
[ -e "${PIDFILE}" ] && retval=1
eend ${retval}
Вроде сам разобрался. Все
Вроде сам разобрался. Все дело действительно в цикле в конце функции stop скрипта /etc/init.d/apache2. Привожу его оригинальный вид:
local i=0 retval=0
while ( test -f "${PIDFILE}" && pgrep -P ${PID} apache2 >/dev/null ) \
&& [ $i -lt ${TIMEOUT} ]; do
sleep 1 && i=$(expr $i + 1)
done
И далее [ -e "${PIDFILE}" ] && retval=1
Что я тут вижу? Например, процесса с именем apache2 уже нет, а PID-файл еще физически не удален, тогда естественно функция вернет 1.
Раз вы проверяете в конце на наличие PID-файла, то зачем в цикле то проверяете еще и процесс? Может тогда заменить
[ -e "${PIDFILE}" ] && retval=1 на
if ( test -f "${PIDFILE}" && pgrep -P ${PID} apache2 >/dev/null ); then
retval=1
fi
Или проверку в цикле замените на ||.
Короче, мое скромное мнение, что это баг в скрипте запуска. Может я не прав, и у кого-то есть какое-то другое объяснение.