如何检查服务(即在给定端口上侦听)是否正常运行?

好吧,让我们说我有一个Nagios设置,使用所谓的nagios插件来监视不同的服务。

对于我的nagios插件(可能用python编写)来确定给定的服务是否正常运行,最好的办法是什么?

有问题的特定服务是一个侦听某个端口的python套接字服务器。 所以我会确保nagios经常检查服务,如果停止响应/死亡,我应该重新启动它。 我该怎么做才能知道套接字服务器是否还活着? 最终,我将如何检查它是否响应。

我可以控制服务 – 如果能帮助我确定它的健康状态,我可以改变它的工作方式。

任何想法都欢迎!

保持在Ubuntu存储库上find的标准Nagios插件,可以使用check_tcp插件发送一个string,然后检查它是否返回预期的响应:

 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检查结合使用,或作为替代scheme。 再次,这取决于你在做什么,以及你想要做多less事情。 如果你想涉足很多,你可以编写一个定制的Nagios检查程序来做各种事情来validation服务的function,并将自定义状态消息返回给Nagios服务器。

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

  1. 您可以先检查进程名是否存在于ps -ef输出中。
  2. 您可以在netstat -lnp | grep your_port输出中查看监听端口 netstat -lnp | grep your_port
  3. 您可以尝试使用python函数连接到端口。
  4. 之后您可以尝试请求一些服务并检查返回的输出。 这与服务有关。 例如,您可以请求HTTP服务的现有页面等。 这将使您也可以测量响应时间。

你可以使用一个python脚本,如你所build议检查,这里是我写的只是检查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