
포트 1700에서 수신 및 전송된 패킷을 표시하는 이 명령이 있습니다.
tcpdump -AUq 포트 1700
패킷에는 문자열이 있지만 rxpk
대부분의 패킷에는 문자열이 없습니다. 출력에 이 문자열이 포함되면 일부 스크립트(LED가 깜박임)를 실행하고 싶습니다.
tcpdump -AUq port 1700 | awk '/rxpk/ { print | "/path/to/blink_led 18" }'
그러나 처음 발견된 경우에만 일치하는 것으로 보이며 rxpk
후속 발생에서는 { ... }
-part가 트리거되지 않습니다.
왜 그런지 아는 사람 있나요? 아니면 스크립트를 rxpk
받았을 때 스크립트를 실행하는 다른 접근 방식이 있을까요?
답변1
LED가 한 번만 깜박이는 이유는 파이프에 인쇄할 때 파이프가 열린 상태로 유지되므로 의 호출이 한 번만 있기 때문입니다 blink_led
. 지침을 위해 표준 입력을 읽는 다면 blink_led
이는 문제가 되지 않습니다. stdin을 읽지 못하고 종료되면 awk
역시 종료됩니다.
이를 해결하는 일반적인 방법은 close()
파이프를 사용하는 것이므로 다음 호출은 새로운 호출을 시작합니다.
tcpdump -Alq port 1700 | awk '
BEGIN { mypipe="/path/to/blink_led 18"; }
/rxpk/ { print | mypipe; close(mypipe); }'
system()
@heemayl이 제안한 것처럼 역시 괜찮습니다(그리고 아마도 blink_led
표준 입력을 전혀 읽는 데 관심이 없다면 더 좋을 것입니다).
원하는 출력이 stdio 버퍼에서 대기 중인 경우 일시 중지를 피하기 위해 stdout을 플러시합니다( -l
파일 -U
에 쓸 때 전체 패킷 플러시를 활성화합니다 ).-l
-U
-w