strace -p $(netstat -tnp|awk -F'[ /]+' "/:$(netstat -tnp|awk -F'[ :]+'
"/\/telnet/{print \$5}") /&&/apache2/{print \$7}")
または、読みやすくするためにフォーマットし、OPのstraceフラグをそのまま使用します。
sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -tnp | \
awk -F'[ /]+' "/:$(netstat -tnp | awk -F'[ :]+' "/\/telnet/ \
{print \$5}") / && /apache2/ {print \$7}")
内訳、最も内側から:
netstat -tnp | awk -F'[ :]+' "/\/telnet/ {print \$5}"
IPアドレスをDNS名に解決せずに、すべてのアクティブなTCP接続を表示します。それをawkにパイプし/telnet
ます。これは、フィールドが1つ以上のスペースとコロンで区切られている、で終わるすべての行に5番目のフィールドを出力します。このフィールドは送信元ポートになります。
改善するには:awkのアクション部分の| head -n 1
末尾または;exit
内部にa を追加することにより、はるかに堅牢にすることができますが、元のバージョンには同等のものがなかったため、これを長くしたくありませんでした。
netstat -tnp | awk -F'[ /]+' "/:**** / && /apache2/ {print \$7}")
****
ここで私はすでに上で、説明してきた部分があります。ここでnetstat -tnp
は、上記で発見したソースポートと同じポートを持ち、Apacheが所有している行を探しています。見つかったら、7番目のフィールドを出力します(1つ以上のスペースまたはスラッシュで区切られています)。これは、Apacheの子のPIDです。
改善するには:(上記と同じ方法で)1つのPIDのみを返す以外に、実際にdportに一致する場合、パターンに偶然に一致する他のものとは対照的に、私が想像できる最大のことは、より識別力があることです。これは、FSにコロンを追加することで簡単にできました(-F
)が、IPv4とIPv6が混在する状況で問題が発生します。この場合、アドレス自体にコロンが含まれる可能性があり、そのため、すぐに厄介になる可能性があります。これは、特にトレーリングスペースに関しては、非常に堅牢であるように見えました。
sudo strace -o /tmp/strace -f -s4096 -r -p
これは、元の質問からの直接のコピーです。私は少なくともそれを修正しませんでした。
いくつかの追加文字を許可すると、実行するバージョンは次のようになります。
sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -tnp | \
awk -F'[ /]+' "/:$(netstat -tnp | awk -F'[ :]+' "/\/telnet/ \
{print \$5;exit}") / && /apache2/ {print \$7;exit}")