使用netstat -lntp检测端口侦听进程时netstat的例外情况是否已关闭?

时间:2017-04-05 02:53:41

标签: python linux netstat

我写过一个像supervisord一样执行的脚本检测进程是否已关闭。当服务器关闭然后启动它。 有时候我发现这个过程正在运行,但是剧本认为它已经失效了。

def check_status(service, port):
    """
        check_the service status.
    args:
        service: the name of the service.
        port:
    """
    cmd = "netstat -lntp | grep %s | grep %s | awk -F '[:]' '{print $2}'" % (service, port)
    logger.info(cmd+"\n")
    results = os.popen(cmd).readlines()
    logger.info(results)
    return bool(results)

这是日志:

2017-04-02 07:53:02,006,1491090782.006675,INFO-netstat -lntp | grep uwsgi | grep 8083 | awk -F '[:]' '{print $2}'

2017-04-02 07:53:02,043,1491090782.043374,INFO-[]
2017-04-02 07:53:02,043,1491090782.043619,INFO-2017-04-02 07:53:02 [ERROR] uwsgi:8083 is down.

2017-04-02 07:53:02,043,1491090782.043733,INFO-2017-04-02 07:53:02 [INFO] try to start uwsgi:8083

2017-04-02 07:53:02,043,1491090782.043814,INFO-cmd:sh /usr/local/sandai/webrtc-env/apprtc/sbin/apprtc.sh start  8083
2017-04-02 07:53:03,100,1491090783.100647,INFO-netstat -lntp | grep uwsgi | grep 8083 | awk -F '[:]' '{print $2}'

2017-04-02 07:53:03,138,1491090783.138201,INFO-['8083                0.0.0.0\n']
2017-04-02 07:53:03,138,1491090783.138506,INFO-2017-04-02 07:53:03 [INFO] uwsgi have been started.

但是当我使用 ps -ef |时grep uwsgi | grep 8083 我发现服务器没有关闭:

[ops01@test 2017.04.02]# ps -ef | grep uwsgi | grep 8083
ops01    22684     1  0  2016 ?        00:03:14 uwsgi --plugin    http,python,gevent --http :8083

使用 netstat 来检测进程是否已关闭是不正确的?为什么?感谢

1 个答案:

答案 0 :(得分:1)

“服务器运行”和“服务器侦听端口”本质上是两回事。根据服务器的实现方式,可能会发生,该进程本身正在运行但无法开始侦听端口。此外,在启动服务器和服务器实际开始侦听端口之间始终存在一些窗口。

我通常会为此目的使用两个独立的过程:

  • 管理程序进程确保服务器进程本身正在运行 - 这可以使用fork()/ wait()函数(或它们的python对应函数)可靠地检测到。如果服务器死机,则可以重新启动。
  • 监控过程确保该服务器正常运行。在那里你必须考虑到你可能有误报并添加一些重试/复核。如果发现该服务器不起作用,它可以通知管理员重新启动服务器或终止服务器并让管理员重新启动它。