一部のローカルプロセスは、ポート1234で127.0.0.1に接続および切断しています。
このポート(またはサーバープロセス)へのすべての接続をログに記録します。
私はもう試した
ss -tpn | grep 1234
リストを表示しますが、停止します。新しい接続のログは記録されないため、ソケットや所有者のPIDを取得できません。
接続および切断ソケットのPIDを検出するためにどのツールを使用できますか?
LinuxでTCP connect
イベントを監視するために使用できる2つのツールがあります。
2つの違いは、前者は出力をカスタマイズするためのオプション(PIDやポート番号によるフィルタリングなど)を提供するのに対し、後者はより単純なツールであり、洗練されたオプションを提供しないことです。
あなたのユースケースでは、最も簡単なオプションはbccをインストールして実行することです:
tcpconnect.py -P 1234
ディストリビューションのパッケージマネージャーを使用してこれらのツールをインストールする場合、一部のディストリビューションは/usr/bin
にtcpconnect
を配置せず、代わりに/usr/share
のような別の場所に配置することに注意してください。したがって、これらのファイルが見つからない場合は、ディストリビューションがこれらのファイルを配置する場所を確認してください。
それを行う「監視」ツールがある、またはあなたができるwhile true; do sleep 2; clear; ss -tulnp | grep 1234 ; done
コードをファイルに追加して、追跡することができます。これはおそらくCPU使用率を生成しますが、あなたが探しているものであなたを助けるかもしれません。
Linux監視コマンド
ss
はソケット統計のみをダンプするため、継続的なダンプをシミュレートする必要があります(watch
またはwhile
ループを使用)、netstat
には継続モードがあります( -c
)。
netstat -ntcp | grep ' 127.0.0.1:1234'
クライアントpidのみをキャプチャする必要がある場合、127 ...の前の2つのスペースはタイプミスではないことに注意してください。
出力例:
$ netstat -ntcp | grep ' 127.0.0.1:1234'
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 127.0.0.1:50146 127.0.0.1:1234 ESTABLISHED 21274/nc
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 127.0.0.1:50146 127.0.0.1:1234 ESTABLISHED 21274/nc
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 127.0.0.1:50146 127.0.0.1:1234 ESTABLISHED 21274/nc
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 127.0.0.1:35720 127.0.0.1:1234 ESTABLISHED 22655/nc
tcp 0 0 127.0.0.1:50146 127.0.0.1:1234 ESTABLISHED 21274/nc
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 127.0.0.1:35720 127.0.0.1:1234 ESTABLISHED 22655/nc
tcp 0 0 127.0.0.1:50146 127.0.0.1:1234 ESTABLISHED 21274/nc
ss
プログラムは、sock_diag(7)
netlinkソケットを使用して、ソケットに関する情報を取得しています。ただし、sock_diag
インターフェースは、rtnetlink(7)
とは異なり、「モニター」/ウォッチング/リスニングモードをサポートしていません。 sock_diag
ソケットを介してのみqueriesを実行できます。
ただし、pcap/tcpdumpを介してtcp syn(= connect)パケットをキャプチャし、sock_diag
インターフェースを使用してそれらに関するプロセス情報を見つけることができます。
しかし、これには少なくとも3つの重大な問題があります。
その情報(ss
、lsof
)をクエリして表示できるすべてのコマンドラインユーティリティは非常に厳格であり、出力形式を構成したり、フィルターとして機能させることは不可能です。コマンドラインから実行できることは、パケットごとに個別のss
インスタンスを実行することだけです。
それは際どいです。プロセスは、パケットをキャプチャしてからプロセスに関する情報を照会するまでの間にすでに終了している可能性があります。
tcpdump
自体は、ss
またはlsof
と同じくらいスクリプトから簡単に使用できます。
これらすべてを念頭に置いて、次のようなものmayするか、少なくとも開始するかもしれません。
socmon(){
script /dev/null -qc "tcpdump -qn -iany '
((tcp[tcpflags] & tcp-syn) != 0 or (ip6 and (ip6[13 + 40] & 2) == 2)) and ($*)
' 2>/dev/null" </dev/null |
Perl -ne 'print; next unless /(\S+)\.(\d+) >/; print qx(ss -Hp src "[$1]:$2") =~ s/.*users:/\t/r'
}
使用法:
>>> socmon dst port 9999
07:14:59.700995 IP6 fe80::89c8:7f7c:29f5:78df.50720 > fe80::89c8:7f7c:29f5:78df.9999: tcp 0
(("xxx",pid=15805,fd=1),("xxx",pid=15804,fd=0))
07:15:08.868555 IP 127.0.0.1.42784 > 127.0.0.1.9999: tcp 0
(("xxx",pid=15851,fd=1),("xxx",pid=15850,fd=0))
07:15:17.055518 IP 172.31.255.1.39700 > 172.31.255.1.9999: tcp 0
(("xxx",pid=15856,fd=1),("xxx",pid=15855,fd=0))
script /dev/null ... </dev/null
は、tcpdump
にラインバッファリングを強制的に使用させます。 tcpdump -l
は、パケットをキャプチャしてから印刷するまでの間に人為的な遅延がないと機能しません。
(ip6 and (ip6[13 + 40] & 2) == 2)
はIPv6では機能しないため、tcp[tcpflags] & tcp-syn
は、SYNパケットBY HANDかどうかを確認します。
Perlはtcpdump出力からソースアドレスとポートを抽出し、それらをフィルター引数としてss
を呼び出し、ss
出力をトリミングしてプロセス情報のみを表示します。
Iptablesまたはnftablesを使用してポートを別のポートにリダイレクトできます。リスニングプログラムは、ピアに関する情報を取得できますbefore接続を受け入れ、接続を宛先に転送します。これは両方の競合を修正し、どこかに接続し、ソケットファイル記述子を他のプロセスに渡したりリークしたりするプロセスによって混乱することはありません。
watch -n 1 -d 'lsof -n -itcp:1234'
ログではなく、ハイライト付きのリアルタイムの強力なモニタリング...
$ man watch
$ man lsof