最近,我网站的访问量急剧增加。我的阿帕奇总是崩溃。我在 httpd/error_log 中看到类似这样的行:
[Sun Apr 13 08:57:18 2014] [warn] child process 7792 still did not exit, sending a SIGTERM
[Sun Apr 13 08:57:20 2014] [error] child process 7925 still did not exit, sending a SIGKILL
...
我将在下个月升级我的服务器。在此之前,我尝试编写一个 Bash 脚本来使用 crond 作业自动重新启动 Apache,该作业每 5 分钟检查一次。
如果curl
ing 某些页面不返回 200 代码,则fuser -k -n tcp 80
和/etc/init.d/httpd restart
。
我不擅长编写 Bash 脚本。我发现一些有效的代码只会重新启动 Apache。
#!/bin/bash
curl -I http://www.mydomain.com/some-empty-page 2>/dev/null \
| head -1 | grep -q " 200 OK"
if [ $? -eq 0 ]; then
echo ""
else
/etc/init.d/httpd restart
echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi
如何修改它以在重新启动之前杀死所有使用端口 80 的作业?
我打算插入一些工作线,例如:
else fuser -k -n tcp 80
/etc/init.d/httpd restart
echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi
注意:首先,然后在其他情况下else fuser -k -n tcp 80
执行。/etc/init.d/httpd restart
答案1
我认为您误解了端口 80 的用法。只有一个守护进程正在侦听端口 80。然后它将传入请求转发到 Apache 工作守护进程。如果您的curl
命令未返回 HTTP 状态 200,我只需运行重新启动脚本即可。
停止/启动服务脚本中应该已经有处理已启动且不愿意关闭的 Apache 的规定。
如果您发现即使在它像这样运行之后:
$ /etc/init.d/httpd stop
$ pgrep httpd
... returns process ID's...
那么你可能想稍微改变你的方法并这样做:
$ /etc/init.d/httpd stop
$ pkill httpd
$ /etc/init.d/httpd start
但正如我所说。你真的不应该做任何这些事情。服务脚本/etc/init.d/httpd
本身应该足够健壮,能够正确处理这些情况。
修改脚本
我会按以下方式修改您所拥有的内容,但否则按原样使用就可以了,IMO。
#!/bin/bash
response=$(curl --write-out %{http_code} --connect-timeout 5 \
--silent --output /dev/null http://www.mydomain.com/some-empty-page)
if [ $response -eq 200 ]; then
echo "All's well"
else
/etc/init.d/httpd restart
echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi
如果你想要killing功能,改变else子句:
else
/etc/init.d/httpd stop
pkill httpd
/etc/init.d/httpd start
echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi
例如,根据您想要执行的重新启动的严重程度,您可以扩展pkill
以提供更严厉的终止信号(SIGKILL aka. -9
),但我会从前者开始。如果您遇到 Apache 挂起的情况,那么接下来添加 else 子句。如果 Apache 仍然悬而未决,那么请使用 SIGKILL。