如何将 `fuser -k -n tcp 80` 写入 bash 脚本?

如何将 `fuser -k -n tcp 80` 写入 bash 脚本?

最近,我网站的访问量急剧增加。我的阿帕奇总是崩溃。我在 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 分钟检查一次。

如果curling 某些页面不返回 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。

相关内容