绑定,但不监听进程

绑定,但不监听进程

简单守护进程的Python代码

import socket
import time
import signal

s=socket.socket()
s.bind(('127.0.1.1', 20201))

def stop(*a, **k):
    global work
    work = False

signal.signal(signal.SIGINT, stop)
signal.signal(signal.SIGTERM, stop)

work = True

while work:
    print('working')
    time.sleep(1)

s.close()

它绑定到端口 20201,因此我可以确定只有一个实例正在运行。如果我尝试运行另一个实例,我会看到错误,正如计划的那样:

Address already in use

但我找不到找到 pid 或有关绑定端口的任何其他信息的方法

netstat -a | grep 20201什么也没给

lsof -i TCP | grep 20201什么也没给出

ss | grep 20201什么也没给出

有没有办法找到绑定的进程,但找不到监听端口?

答案1

我试过lsof -p <pid of python process>。它包括以下行:

python  1834 barmar    3u  sock    0,6       0t0 70994705 can't identify protocol

因此,虽然您无法找到以这种方式绑定特定端口的进程,但您可以使用

lsof | grep "can't identify protocol"

查找所有已绑定端口但未连接或侦听的进程。如果有多个,您可能可以找出哪个可能正在使用您关心的端口。

请注意,套接字还有其他方法可以进入此状态。当我运行上面的命令时,它列出了一个长期空闲的mysql进程。这是因为mysqld超时后会关闭空闲的客户端连接。mysql当它尝试发送新查询时会检测到这一点,并在那时重新连接。但在此之前,客户端进程仍打开旧套接字,但没有与其关联的 TCP 连接。

答案2

您的 IP:端口组合可能由某个客户套接字,有时会因为运气不好而发生(客户端套接字的本地端口是随机生成的“临时端口”)。检查已建立的 TCP 连接(-l 限制侦听套接字):

ss -tnp |grep :20201

否则,在套接字创建和绑定之间应用SO_REUSEADDR套接字选项,侦听 IP:port 在进程终止后不一定可以立即重用(同样是因为任何现有客户端套接字已连接到现有 IP:port 源,但处于 TIME_WAIT 状态)状态)。

相关内容