我写了一个一个像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/