如何检查服务(监听给定端口)是否启动并正常工作?

如何检查服务(监听给定端口)是否启动并正常工作?

好的,假设我有一个 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

有多种方法可以确保服务正在运行。

  1. 您可以首先检查ps -ef输出中是否存在该进程名称。
  2. 您可以在输出中检查监听端口netstat -lnp | grep your_port
  3. 您可以尝试使用 python 函数连接到端口。
  4. 之后,您可以尝试请求某些服务并检查返回的输出。这与服务有关。例如,您可以请求 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

相关内容