Как я могу проверить статус apache2, когда он перегружен? То есть когда он не отвечает на HTTP-запросы?
apache2ctl status
в основном wget
на странице статуса. Мне нужно что-то, что работает в командной строке, не запрашивая эту страницу.
Я знаю два метода, которые могут вам пригодиться:
1) mod_backdoor указывает специальный поток и прослушивающий сокет, который позволяет вам нажимать / server-status, когда все нормальные потоки связаны (должно легко найти его в веб-поиске)
http://people.apache.org/~trawick/mod_backdoor.txt http://people.apache.org/~trawick/mod_backdoor.c
2) Perl может анализировать табло Apache, если вы разрешите ему использовать табло на диске (ScoreBoardFile)
http://search.cpan.org/~opi/Apache2-ScoreBoardFile-0.01/lib/Apache2/ScoreBoardFile.pm
Это один из случаев, когда наличие надлежащей системы мониторинга окупается. Он собрал бы вам всю статистику с течением времени и покажет вам последнюю известную статистику, даже когда служба выйдет из строя. Не говоря уже о возможности получать уведомления, когда ваши пулы ресурсов начинают опустошаться, чтобы вы могли действовать до того, как обслуживание будет остановлено.
Когда молоко уже пролилось на пол, думаю, то, что предложил r_3, - неплохое решение.
установите правильную систему мониторинга или поиграйте с bash:
#!/bin/bash
# WTF APACHE???
# cpu count
CPU=$(cat /proc/cpuinfo | grep "^processor" | wc -l)
# load average count
LOAD_5=$(cat /proc/loadavg | awk '{print $2}')
LOAD_AVERAGE_5=$(($(echo ${LOAD_5} | awk '{print 100 * $1}') / ${CPU}))
# Red Alert : 85% high load 5 min
# send some mail with status
if [ ${LOAD_AVERAGE_5} -ge 85 ] ; then
httpd status > /tmp/apache_status.log
mail -s "APACHE STATUS" you@mail.com < /tmp/apache_status.log
service httpd stop
else [ ${LOAD_AVERAGE_5} -le 50 ] ; then
if ps aux | grep [h]ttpd; then echo 'OK'; else service httpd start; fi
fi
Интересный вопрос, но я уверен, что вы не можете. Обходной путь может состоять в том, чтобы убить некоторые потоки apache и убедиться, что вы первым подключаетесь к вновь созданным процессам, чтобы показать статус apache.
Изменить: да, давайте поиграем с bash
Следующее работает, вытягивая табло вашей страницы состояния сервера Apache и позволяя вам определить, когда реагировать.
Используйте для этого функцию _f_custom (). Я построил два примера:
`
#!/bin/bash
_sleep="5"
_f_getfullstatus() {
curl $_uri 2> /dev/null
}
_f_mailto() {
( echo -e "To:$1\nFrom:$1\nSubject:${2}:\n\n${3} ${4}" ; _f_getfullstatus ) | sendmail -t
}
_f_custom() {
case "$1" in
_)
;;
S)
;;
W)
if [[ $2 -gt 150 ]] ; then _f_mailto $_email "Houson, we've got a problem" "Currently there are $2 processes in "sending reply" mode" ; fi
;;
K)
;;
D)
;;
L)
;;
G)
;;
I)
;;
.)
if [[ $2 -lt 20 ]] ; then _f_mailto $_email "Running out of open slots" "there are only $2 available atm" ; fi
;;
esac
}
_f_count() {
for _status in _ S R W K D C L G I \.
do
_counter=$(echo $_auto_output | sed "s/[^$_status]//g" | wc -m)
if [[ $_verbose == "yes" ]] ; then
echo -n "Status of key ${_status}:"
echo $_counter
fi
_f_custom $_status $_counter
done
}
while [[ $# > 0 ]] ; do
_opt="$1"
case $_opt in
-u)
shift
_uri="$1"
;;
-m)
shift
_email="$1"
;;
-s)
shift
_sleep="$1"
;;
-D)
_daemon="yes"
;;
-v)
_verbose="yes"
;;
esac
shift
done
_auto_output=$(curl ${_uri}?auto 2> /dev/null | tail -1 | sed 's/Scoreboard: //g')
if [[ $_daemon == "yes" ]] ; then
while true ; do
_f_count
sleep $_sleep
done
else
_f_count
fi
Это требует sendmail
и curl
в $PATH
поскольку --help не реализован:
-u: URI to server-status page
-m: sets a emailaddress to send your errors to
-v: let it run verbosly
-D: let it run in w while true loop (daemonize)
-s: interval in seconds between status requests