이 명령을 어떻게 단순화 하시겠습니까?


10

나는 strace / netstat / etc에 익숙하지 않다. 나는이 명령을 사용하여 내 요청 (telnet)을 처리하는 아파치 프로세스의 흔적을 얻는 중이다. 조금 단순화하는 방법이 있습니까?

sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -antlp | \ 
    grep $(lsof -p `pidof telnet` | grep TCP | \
    perl -n -e'/localhost:(\d+)/ && print $1') | grep apache2 | \ 
    perl -n -e'/ESTABLISHED (\d+)/ && print $1')

감사!


텔넷 프로세스를 시작하기 전이나 후에 이것을 실행 중입니까?
deltaray 2016 년

시작된 후에는 아파치에 연결될 때까지 몇 초 정도 기다려야합니다. 그러면 strace를 실행할 수 있습니다.
Andrei Serdeliuc

1
명령이 작동하면 단순화하지 마십시오.
톰 오코너

답변:


1

Mark Henderson의``대신 $ () 대신 ''sed로 grep을 제거하는 것이 좋습니다.

sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -antlp | \
   sed -e "/telnet/s/^.*ESTABLISHED\ \|\/.*$//g")

개인적으로 나는 백틱으로 인해 읽기가 어렵다고 생각합니다. 또한 $ () 구문과 달리 중첩되지 않습니다.


+1, 우수한 스크립트 Fu 및 일부 쉘 기능에 대한 좋은 학습 예.
Jeff Ferland

이 스크립트 strace는 제공하는 Apache 프로세스가 아니라 텔넷에 연결됩니다.
BMDan

2

strace -p $(ss -npt|sed -n "/:$(ss -npt|sed -n '/telnet/s/^.*\?:\([0-9]\+\).*/\1/p') \+u/s/.*,\(.*\),.*/\1/p")

하나만 telnet실행 strace하는 한 해당 서버가있는 경우 해당 서버가됩니다.

하나가 아닌 경우 ( 예 : 당신이 telnet외부 서버 마지막 에드), strace실패합니다strace: option requires an argument -- 'p'


1
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필드는 하나 이상의 공백과 콜론으로 구분되는로 끝나는 행에 다섯 번째 필드를 인쇄합니다 . 이 필드는 소스 포트가됩니다.

개선 : awk | head -n 1의 끝 부분이나 ;exit내부에 a 를 추가하여 훨씬 더 견고하게 만들 수는 있지만 원래 버전에는 해당 기능이 부족 하므로이 버전을 더 길게 만들고 싶지 않았습니다.

netstat -tnp | awk -F'[ /]+' "/:**** / && /apache2/ {print \$7}")

****여기에 위에서 이미 설명한 부분 이 있습니다. 여기서, netstat -tnp위에서 발견 한 소스 포트와 동일한 포트를 가지며 Apache가 소유 한 라인을 찾고 있습니다 . 찾을 때 일곱 번째 필드를 인쇄합니다 (하나 이상의 공백 또는 슬래시로 구분). 이것은 Apache 자식의 PID입니다.

개선하기 : (위와 동일한 방법을 통해) 하나의 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}")

0

이것을 시도하고 도움이되기를 바랍니다.

sudo strace -o /tmp/strace -f -s4096 -r -p `netstat -antlp | \
  grep telnet | sed -e "s/^.*ESTABLISHED\ \|\/.*$//g"`

오른쪽으로 스크롤하지 않아도 모든 대답을 볼 수 있다면 대답이 더 좋아 보일 것입니다.
djangofan

strace에이야 telnet, 아파치 없습니다.
Pierre Carrier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.