簡単なデーモンのための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接続はありません。