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

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

最佳答案

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

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

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

关于python - 使用netstat -lntp 检测监听端口的进程是否关闭时netstat 出现异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43220973/

相关文章:

linux - 为什么我的端口没有暴露?包括 netstat 输出

python - 为 Youtube 自动生成的字幕自动打开脚本

linux - Bash脚本在文件结束后循环

linux - 设置包含文件内信息的变量

linux - 如何正确格式化这个 bash if 语句?

windows - 如何使用批处理脚本最好通过 WINDOWS 中的端口 80 终止 CLOSE_WAIT 状态进程

tcp - linux中netstat -na命令的理解

python - Cython 不适用于带参数的双装饰器。有解决方法吗?

python - 用于注册/登录用户的 Django REST Framework 和 python-social-auth

Python 将 1970 年之前的日期格式从 dd/mm/yy 更改为 dd/mm/yyyy