バインディングがプロセスを聞くことはありません。

バインディングがプロセスを聞くことはありません。

簡単なデーモンのための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にバインドされているので、インスタンスが1つだけ実行されていると確信しています。別のインスタンスを実行しようとすると、計画どおりにエラーが表示されます。

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接続はありません。

おすすめ記事