Мне нужно перезапустить Apache и Varnish и отправить несколько журналов по электронной почте, если скрипт не может получить файл robots.txt, но я получаю сообщение об ошибке.
./healthcheck: 43 [[: not found
Мой сервер - Ubuntu 12.04 64-бит
#!/bin/sh
# Check if can fetch robots.txt if not then restart Apache and Varnish
# Send last few lines of logs with date via email
PATH=/bin:/usr/bin
THEDIR=/tmp/web-server-health
EMAIL=dude@email.net
mkdir -p $THEDIR
if ( wget --timeout=30 -q -P $THEDIR http://website.com/robots.txt )
then
# we are up
touch ~/.apache-was-up
else
# down! but if it was down already, don't keep spamming
if [[ -f ~/.apache-was-up ]]
then
# write a nice e-mail
echo -n "Web server down at " > $THEDIR/mail
date >> $THEDIR/mail
echo >> $THEDIR/mail
echo "Apache Log:" >> $THEDIR/mail
tail -n 30 /var/log/apache2/error.log >> $THEDIR/mail
echo >> $THEDIR/mail
echo "AUTH Log:" >> $THEDIR/mail
tail -n 30 /var/log/auth.log >> $THEDIR/mail
echo >> $THEDIR/mail
# kick apache
echo "Now kicking apache..." >> $THEDIR/mail
/etc/init.d/varnish stop >> $THEDIR/mail 2>&1
killall -9 varnishd >> $THEDIR/mail 2>&1
/etc/init.d/varnish start >> $THEDIR/mail 2>&1
/etc/init.d/apache2 stop >> $THEDIR/mail 2>&1
killall -9 apache2 >> $THEDIR/mail 2>&1
/etc/init.d/apache2 start >> $THEDIR/mail 2>&1
# prepare the mail
echo >> $THEDIR/mail
echo "Good luck troubleshooting!" >> $THEDIR/mail
# send the mail
sendemail -o message-content-type=html -f alerts@website.net -t $EMAIL -u ALARM -m < $THEDIR/mail
rm ~/.apache-was-up
fi
fi
rm -rf $THEDIR
Хотя сценарий может работать, с ним связаны некоторые проблемы, например небезопасное использование временных файлов.
Вам действительно стоит взглянуть на Монит, это открытый исходный код, и легко написать правило, которое перезапускает ваши веб-службы на основе ответов службы. Он также может определять, умирает ли запущенный процесс (например, его PID уходит), и у вас есть возможность временно отключить проверку (например, когда вы выполняете сервисное обслуживание).
Я думаю, что это то, что вы ищете (я предпочитаю / tmp, так как он удаляется после перезагрузки, поэтому начните с нуля).
#!/bin/sh
# Check if can fetch robots.txt if not then restart Apache and Varnish
# Send last few lines of logs with date via email
PATH=/bin:/usr/bin
THEDIR=/tmp/web-server-health
EMAIL=dude@email.net
mkdir -p $THEDIR
if ( wget --timeout=30 -q -P $THEDIR http://website.com/robots.txt )
then
# we are up
touch /tmp/.apache-was-up
else
# down! but if it was down already, don't keep spamming
if [ -f /tmp/.apache-was-up ];
then
# write a nice e-mail
echo -n "Web server down at " > $THEDIR/mail
date >> $THEDIR/mail
echo >> $THEDIR/mail
echo "Apache Log:" >> $THEDIR/mail
tail -n 30 /var/log/apache2/error.log >> $THEDIR/mail
echo >> $THEDIR/mail
echo "AUTH Log:" >> $THEDIR/mail
tail -n 30 /var/log/auth.log >> $THEDIR/mail
echo >> $THEDIR/mail
# kick apache
echo "Now kicking apache..." >> $THEDIR/mail
/etc/init.d/varnish stop >> $THEDIR/mail 2>&1
killall -9 varnishd >> $THEDIR/mail 2>&1
/etc/init.d/varnish start >> $THEDIR/mail 2>&1
/etc/init.d/apache2 stop >> $THEDIR/mail 2>&1
killall -9 apache2 >> $THEDIR/mail 2>&1
/etc/init.d/apache2 start >> $THEDIR/mail 2>&1
# prepare the mail
echo >> $THEDIR/mail
echo "Good luck troubleshooting!" >> $THEDIR/mail
# send the mail
sendemail -o message-content-type=html -f alerts@website.net -t $EMAIL -u ALARM -m < $THEDIR/mail
rm /tmp/.apache-was-up
fi
fi
rm -rf $THEDIR
if [[ -f ~/.apache-was-up ]]
В Ubuntu /bin/sh
символическая ссылка на рывок вместо того трепать. dash - это минимальная оболочка, разработанная для сценариев, тогда как bash более функциональна и предназначена для интерактивного использования. В [[ <expression> ]]
синтаксис реализован только в bash, а не в тире, поэтому вы получаете эту ошибку. В [ <expression> ]
Синтаксиса достаточно для того, что вам нужно, поэтому измените эту строку на эту:
if [ -f ~/.apache-was-up ]
Вот подробный ответ о том, как использовать Monit для мониторинга и перезапуска Varnish, если он не работает.
Сначала посетите http://www.tecmint.com/how-to-install-and-setup-monit-linux-process-and-services-monitoring-program/ чтобы получить основную информацию о Monit и установить его. Это полезное руководство, поскольку в нем указаны пути по умолчанию для RHEL / CentOS и Debian / Ubuntu.
Во-вторых, посетите https://www.computerminds.co.uk/articles/monitoring-varnish и следуйте инструкциям по настройке мониторинга Varnish.
Вот несколько заметок из моей настройки:
curl 127.0.0.1:80/varnish-ping
из командной строки и убедитесь, что он возвращает ответ 200.set log /var/log/monit.log
в теме.chkconfig --list
чтобы подтвердить его присутствие.Надеюсь, что это поможет представить более надежную альтернативу. Обратите внимание, что вы также можете добавить мониторинг электронной почты для служб через Monit. Вот еще несколько подробностей об оповещениях по электронной почте: https://fak3r.com/2010/04/10/howto-use-monit-to-monitor-sites-and-alert-users/