![如何检查服务(监听给定端口)是否启动并正常工作?](https://linux22.com/image/581891/%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%E6%9C%8D%E5%8A%A1%EF%BC%88%E7%9B%91%E5%90%AC%E7%BB%99%E5%AE%9A%E7%AB%AF%E5%8F%A3%EF%BC%89%E6%98%AF%E5%90%A6%E5%90%AF%E5%8A%A8%E5%B9%B6%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
好的,假设我有一个 Nagios 设置,它使用所谓的 nagios-plugins 来监控不同的服务。
我的 nagios 插件(可能是用 python 编写的)的最佳做法是什么,以确定给定的服务是否正常运行?
所讨论的特定服务是侦听某个端口的 Python 套接字服务器。因此,我将确保 nagios 经常检查该服务,如果它停止响应/死机,我应该重新启动它。我应该怎么做才能知道套接字服务器是否处于活动状态?最终我将如何检查它是否正在响应。
我可以控制该服务——如果这有助于我确定它的健康状况,我可以改变它的工作方式。
欢迎任何想法!
答案1
保持在 Ubuntu 存储库上找到的标准 Nagios 插件,您可以使用该check_tcp
插件发送字符串,然后检查它是否返回预期的响应:
Usage:check_tcp -H host -p port [-w <warning time>] [-c <critical time>] [-s <send string>]
[-e <expect string>] [-q <quit string>][-m <maximum bytes>] [-d <delay>]
[-t <timeout seconds>] [-r <refuse state>] [-M <mismatch state>] [-v] [-4|-6] [-j]
[-D <days to cert expiry>] [-S <use SSL>] [-E]
由于您可以修改服务,因此您可以执行类似“您还好吗?”的操作并搜索“我很好”。这取决于您想在多大程度上参与检查服务是否正常运行。
您还可以使用它check_procs
来查看服务进程是否存在。这可能与 check_tcp 检查结合使用,或作为替代方法。同样,这取决于您正在做什么,以及您实际上想做多少。如果您想深入参与,您可以编写自定义 Nagios 检查,它将执行各种操作来验证服务的功能并向 Nagios 服务器返回自定义状态消息。
答案2
有多种方法可以确保服务正在运行。
- 您可以首先检查
ps -ef
输出中是否存在该进程名称。 - 您可以在输出中检查监听端口
netstat -lnp | grep your_port
。 - 您可以尝试使用 python 函数连接到端口。
- 之后,您可以尝试请求某些服务并检查返回的输出。这与服务有关。例如,您可以请求 HTTP 服务的现有页面等等。这也将使您能够测量响应时间。
答案3
您可以按照建议使用 Python 脚本进行检查,这是我编写的仅检查 1 个端口的脚本。 https://github.com/jonzobrist/Bash-Admin-Scripts/blob/master/tcpcheck.py
这是稍有不同的版本,速度更快,并且会检查您指定的相同端口次数。它会在不到半秒的时间内访问本地服务器 1500 次。
https://github.com/jonzobrist/Bash-Admin-Scripts/blob/master/tcpcheck-bulk.py
如果您正在寻找本地 shell 脚本,pgrep processname 效果很好,在 Bash 中类似这样的命令应该可以得到您想要的东西。
PROC_PID=$(pgrep processname)
if [ "${PROC_PID}" ]
then
echo "Process is running"
else
echo "Process is not running"
fi
你可以使用 lsof -i :PORT 执行类似操作,对于 https/tcp 443 如下所示
PORT_LISTEN=$(lsof -i :443 | grep LISTEN)
if [ "${PORT_LISTEN}" ]
then
echo "Port is listening ${PORT_LISTEN}"
else
echo "Nothing is listening on 443"
fi