使用netstat -lntp 检测侦听端口的进程是否关闭时netstat 出现异常?

An exception of netstat when using netstat -lntp to detect a process listening on a port is down or not?

我写了一个脚本,它的表现类似于 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 }'" % (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 }'

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 }'

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 检测进程是否已关闭是否不合适?为什么?谢谢

"Server running" 和 "server listening on the port" 本质上是两个不同的东西。根据服务器的实现方式,它可能会发生,该进程本身是 运行 但它无法开始侦听端口。此外,在启动服务器和服务器实际开始侦听端口之间总是有一些 window。

我通常为此目的使用两个单独的进程:

  • supervisor process is making sure that the server process itself are 运行 - 这可以使用 fork()/wait() 函数(或它们的 python 对应函数)可靠地检测到。如果服务器死机,则可以重新启动它。
  • 监控过程正在确保服务器正常工作。那里你必须考虑你可能有误报并添加一些 retries/double-checks。如果发现该服务器无法正常运行,它可以通知主管重新启动服务器或自行杀死服务器并让主管重新启动它。