我写过一个像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 来检测进程是否已关闭是不正确的?为什么?感谢
答案 0 :(得分:1)
“服务器运行”和“服务器侦听端口”本质上是两回事。根据服务器的实现方式,可能会发生,该进程本身正在运行但无法开始侦听端口。此外,在启动服务器和服务器实际开始侦听端口之间始终存在一些窗口。
我通常会为此目的使用两个独立的过程: