strace -p $(netstat -tnp|awk -F'[ /]+' "/:$(netstat -tnp|awk -F'[ :]+'
"/\/telnet/{print \$5}") /&&/apache2/{print \$7}")
Ou formatado para facilitar a leitura e com os sinalizadores de rastreamento do OP intactos:
sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -tnp | \
awk -F'[ /]+' "/:$(netstat -tnp | awk -F'[ :]+' "/\/telnet/ \
{print \$5}") / && /apache2/ {print \$7}")
Desagregação, a mais interna primeiro:
netstat -tnp | awk -F'[ :]+' "/\/telnet/ {print \$5}"
Mostre-me, sem resolver endereços IP para nomes DNS, todas as conexões TCP ativas. Canalize para awk, que imprime o quinto campo em qualquer linha que termina em /telnet
, onde os campos são separados por um ou mais espaços e dois pontos. Este campo será a porta de origem.
Para melhorar : poderia ser muito mais robusto adicionando um | head -n 1
ao final ou um ;exit
dentro da parte de ação do awk, mas sua versão original não possuía um equivalente, por isso não queria prolongar essa.
netstat -tnp | awk -F'[ /]+' "/:**** / && /apache2/ {print \$7}")
A ****
aqui é a parte que eu já expliquei acima. Aqui, estou procurando por qualquer linha netstat -tnp
que tenha a mesma porta que a porta de origem que descobri acima e seja de propriedade do Apache; quando o encontro, imprimo o sétimo campo (delimitado por um ou mais espaços ou barras). Este é o PID do filho Apache.
Para melhorar : além de retornar apenas um PID (através dos mesmos métodos acima), a maior coisa que posso imaginar é ser mais discriminativo quando se trata de realmente corresponder ao dport em oposição a outra coisa que se encaixa no padrão. Isso seria fácil adicionando dois pontos ao FS ( -F
), mas o problema ocorre em situações mistas de IPv4 vs. IPv6, onde pode haver dois pontos no próprio endereço e, como tal, podem se tornar desagradáveis rapidamente. Isso parecia bastante robusto, especialmente com o espaço à direita.
sudo strace -o /tmp/strace -f -s4096 -r -p
Esta é uma cópia direta da sua pergunta original; Eu não o modifiquei nem um pouco.
Se você me permitir alguns caracteres extras, a versão que eu executaria pode ser:
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}")