인터럽트 전 강제 핑 쓰기

인터럽트 전 강제 핑 쓰기

여러 번 연속으로 파일에 쓰기 위해 ping을 시도하고 있습니다. 내가 달릴 때

 $ ping 10 10.1.10.28 | perl -ne '/time=(\d+\.\d+)/ && print "$1\n"'

몇 밀리초마다 숫자를 반환합니다.

$ ping 10 10.1.10.28  | perl -ne '/time=(\d+\.\d+)/ && print "$1\n"'
191.523
312.225
127.506

그러나 파일로 리디렉션하고 tail -f해당 파일을 다른 곳으로 리디렉션하면 아무 일도 일어나지 않습니다. Ctrl-C를 누르면 파일에 아무 것도 기록되지 않습니다.

새 데이터가 들어올 때 ping이 STDOUT에 쓰도록 하려면 어떻게 해야 합니까?

답변1

파이프 버퍼링으로 인해 어려움을 겪고 있습니다. 일반적으로 비대화형 터미널의 출력은 파이프될 때까지 4Kb 청크로 버퍼링되므로 이를 비활성화해야 합니다.

다음과 같이 명령줄을 변경할 수 있습니다.

$ stdbuf -oL ping 10.1.10.28  | perl -ne '$|=1; /time=(\d+\.\d+)/ && print "$1\n"' > file

stdbufcoreutils의 일부입니다.

$|=1;갈 길이야Perl에서 출력 버퍼링 비활성화.

PD ping 명령에서 추가 "10"을 제거했습니다.

관련 정보