当脚本无法获取robots.txt时,我需要重新启动Apache和Varnish,并通过电子邮件发送一些日志,但是出现错误
./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 protected] 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 [email protected] -t $EMAIL -u ALARM -m < $THEDIR/mail rm ~/.apache-was-up fi fi rm -rf $THEDIR
if [[ -f ~/.apache-was-up ]]
在Ubuntu中, /bin/sh是破折号而不是bash的符号链接。 破折号是为脚本devise的最小shell,而bash更多function和devise用于交互式使用。 [[ <expression> ]]语法仅在bash中实现,而不是在短划线中,因此您会收到该错误。 虽然[ <expression> ]语法对于你所需要的是足够的,所以把这一行改为:
if [ -f ~/.apache-was-up ]
我想这就是你要找的东西(我更喜欢/ 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 protected] 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 [email protected] -t $EMAIL -u ALARM -m < $THEDIR/mail rm /tmp/.apache-was-up fi fi rm -rf $THEDIR
虽然脚本可能工作,但也有一些问题,如不安全地使用临时文件。
你真的应该看看Monit ,它的开源,并且很容易编写一个规则,根据服务响应重启你的Web服务。 它也可以检测正在运行的进程是否死亡(例如,它的PID消失),并且可以暂时停用检查(例如,当您正在进行服务维护时)。
下面是关于如何使用Monit监视并重新启动Varnish的详细答案。
首先,请访问http://www.tecmint.com/how-to-install-and-setup-monit-linux-process-and-services-monitoring-program/获取有关Monit的一些基本信息,并安装它。 这是一个有用的教程,因为它给出了RHEL / CentOS和Debian / Ubuntu的默认path。
其次,请访问https://www.computerminds.co.uk/articles/monitoring-varnish并按照有关设置清漆监控的说明进行操作。
以下是我的设置中的一些注意事项:
curl 127.0.0.1:80/varnish-ping并确保它返回200响应来设置一次。 set log /var/log/monit.log 。 chkconfig --list来确认它是否存在。 希望有助于提出一个更可靠的select。 请注意,您也可以通过Monit为服务添加电子邮件监视。 以下是关于电子邮件警报的更多详细信息: https : //fak3r.com/2010/04/10/howto-use-monit-to-monitor-sites-and-alert-users/